Saya mungkin dapat menulis skrip shell untuk mencari file saja, kemudian meneruskan daftar ke tar, tapi saya bertanya-tanya apakah sudah ada fitur built-in di tar yang memungkinkan melakukan hal itu, dalam satu baris perintah?
Misalnya, saya menemukan --no-recursion
sakelar, tetapi ketika saya melakukannya:
tar --no-recursion -cvf mydir.tar mydir
Ini hanya mengarsipkan nama entri dalam direktori (termasuk subdirektori!), Tetapi tidak mengarsipkan file apa pun.
Saya juga mencoba:
tar --no-recursion -cvf mydir.tar mydir/*
Tetapi sementara file arsip saja, itu juga mengarsipkan nama - nama subdirektori.
Apakah ada cara untuk memberi tahu file tar saja, tidak ada direktori?
find mydir -type f |xargs cp -t tempdir
dan kemudian tar tempdir.find mydir -depth 1 -type f | xargs tar cf mydir.tar
find mydir -maxdepth 1 -type f -exec tar cvf mydir.tar {} +
. The+
menempatkan semua file pada baris perintah yang sama seperti xargs.Jawaban:
Seperti yang ditunjukkan oleh camh, perintah sebelumnya memiliki masalah kecil karena diberi terlalu banyak nama file, perintah itu akan dieksekusi lebih dari sekali, dengan pemanggilan selanjutnya secara diam-diam menghapus proses sebelumnya. Karena kami tidak mengompresi juga, kami dapat menambahkan alih-alih menimpa:
Jawaban Iocnarz ini menggunakan
tar
's--null
dan-T
pilihan bekerja dengan baik. Jika Anda telahcpio
menginstal, jawaban camh menggunakan itu juga baik-baik saja. Dan jika Anda memilikizsh
dan tidak keberatan menggunakannya untuk suatu perintah, jawaban Gilles menggunakan bola zsh (*(.)
) tampaknya paling mudah.Kuncinya adalah
-maxdepth
opsi. Jawaban akhir, berurusan dengan spasi secara tepat:Ini juga harus bekerja:
sumber
tar
. Keduanyaxargs
danfind
dengan+
varian memiliki jumlah argumen maksimum yang dapat diteruskan ke tar. Ini akan menghasilkan doa kedua tar yang menimpa output yang pertama.-x
untuk memaksa xarg gagal daripada kehilangan data, dan sementara lebih baik daripada bug kehilangan data diam, itu masih tidak ideal. Bug semacam ini sangat berbahaya karena semuanya tampak baik-baik saja pada awalnya, tetapi ketika daftar file bertambah seiring waktu, Anda mulai memicu dan mungkin tidak menyadarinya sampai Anda mencoba mengembalikan cadangan. Maka sudah terlambat.Bila Anda ingin menggunakan
find
dengantar
, cara terbaik adalah dengan menggunakancpio
bukantar
.cpio
dapat menulis arsip tar dan dirancang untuk mengambil daftar file yang akan diarsipkan dari stdin.Menggunakan
find
dancpio
merupakan pendekatan yang lebih unix-y di mana Anda membiarkanfind
melakukan pemilihan file dengan semua kekuatan yang dimilikinya, dan biarkancpio
melakukan pengarsipan. Anda perlu mempelajari penggunaan sederhana inicpio
, karena Anda merasa mudah untuk menyelesaikan masalah yang Anda hadapi ketika mencobatar
.sumber
-maxdepth
sebelumnya-type
.Saya tidak yakin saya mengerti kebutuhan Anda. Jika Anda ingin menyimpan file biasa
mydir
tetapi tidak di subdirektori, cara termudah adalah menggunakan zsh, di mana hanya mencocokkan file biasa adalah masalah sederhana menggunakan.
kualifikasi glob :sumber
Anda bahkan dapat menggunakan
find ... -print0
dantar ... --null
langsung tanpa menggunakanxargs
sama sekali.Dalam contoh yang diberikan,
--no-recursion
opsi untuktar
tidak diperlukan karena hanya path file (dan bukan direktori) yang akan diteruskan darifind
ketar
.Menggunakan
--no-recursion
opsi untuktar
dalam contoh berikut, bagaimanapun, mencegahtar
direktori pengarsipan ganda.find
akan melakukan rekursi pohon direktori bukantar
itu.sumber
Seperti paragraf pengantar dalam
man tar
mengatakan (kalimat terakhir),Yang saya pahami sebagai jawaban "tidak" untuk pertanyaan Anda.
sumber
--no-recursion
,--exclude-tag
, dll). Saya mencari--exclude-tag
yang terlihat menjanjikan tetapi tampaknya kebalikan dari apa yang saya cari.Hapus
-C startdir
dan ganti.
denganstartdir
jika harus muncul di arsip.Ini adalah metode paling efisien berdasarkan fitur libfind. Libfind juga menawarkan pemilihan pendahuluan
-chown
-chgrp
-chmod
yang mengubah stat struct di tempat dan memungkinkan untuk mengarsipkan metadata yang berbeda. Ini juga berfungsi dalam mode daftar dan ekstrak dan menghindari kebutuhan untuk mengekstrak seluruh arsip dalam banyak kasus.sumber
-find
dalam-copy
mode. Sinopsis halaman manual menyarankan Anda bisa, tetapi saya belum dapat membuatnya berfungsi (ketika mencoba menjawab Bagaimana cara menyalin file yang dimodifikasi sambil mempertahankan struktur folder ) (dengan schily-2016-02-10)star -find
.Saya mungkin telah menemukan solusi.
find mydir -type f -printf '%P\0'|tar czvf mydir.tar.gz -C mydir --null -T -
Ini mungkin sedikit mahal, tetapi bagaimanapun itu akan berhasil, karena ini tidak tergantung pada xargs.
sumber
dir = your_dir; cd $ dir; tar -cvf file.tar `find. -maxdepth 1 -type f -print`
sumber