Saya biasanya melakukan:
tar -czvf my_directory.tar.gz my_directory
Bagaimana jika saya hanya ingin memasukkan semuanya (termasuk file sistem tersembunyi) di my_directory, tetapi bukan direktori itu sendiri? Saya tidak mau:
my_directory
--- my_file
--- my_file
--- my_file
Saya ingin:
my_file
my_file
my_file
tar -czf
? Dalam kasus saya ini hanya menyimpan file dan bukan direktori. Ketika saya hanyatar
direktori itu termasuk tetapi dengantar -czf
itu hanya menambahkan file.Jawaban:
harus melakukan pekerjaan dalam satu baris. Ini berfungsi dengan baik untuk file tersembunyi juga. "*" tidak memperluas file tersembunyi dengan ekspansi nama jalur, setidaknya dalam bash. Di bawah ini adalah eksperimen saya:
sumber
.
dengan*
sehingga perintah akancd my_directory/ && tar -zcvf ../my_dir.tgz * && cd ..
maka itu akan berfungsi seperti yang Anda harapkan.$ (cd my_directory/ && tar -zcvf ../my_dir.tgz .)
cd
masuk ke direktori dan keluar cukup timpang. Paling tidak bisa menggunakanpushd
danpopd
jikatar
tidak memiliki bendera seperti-C
.Gunakan
-C
sakelar tar:The
-C my_directory
memberitahukan tar untuk mengubah direktori kemy_directory
, dan kemudian.
berarti "menambahkan seluruh direktori saat ini" (termasuk file tersembunyi dan sub-direktori).Pastikan Anda melakukannya
-C my_directory
sebelum melakukannya.
atau Anda akan mendapatkan file di direktori saat ini.sumber
tar --create --file=foo.tar -C /etc passwd hosts -C /lib libc.a
" apl.jhu.edu/Misc/Unix-info/tar/tar_65.html Saya selalu mencobatar -czvf my_directory.tar.gz * -C my_directory
dan itu tidak bekerja.-C
lokasi itu penting! Sialan ...*
tidak akan menyertakan file tersembunyi (yang merupakan persyaratan asli).Anda juga dapat membuat arsip seperti biasa dan mengekstraknya dengan:
sumber
--strip-components
adalah ekstensi GNU.Lihat
--transform
/--xform
, ini memberi Anda kesempatan untuk memijat nama file saat file ditambahkan ke arsip:Transformasi ekspresi mirip dengan
sed
, dan kita dapat menggunakan pemisah selain/
(,
dalam contoh di atas).https://www.gnu.org/software/tar/manual/html_section/tar_52.html
sumber
file list too long
. Solusi saya mencegah itu dan lebih fleksibel juga.--xform
beberapa kali untuk beberapa jalur.TL; DR
Dengan beberapa kondisi (arsipkan hanya file, dir, dan symlink):
Penjelasan
Sayangnya di bawah ini termasuk direktori induk
./
dalam arsip:Anda dapat memindahkan semua file dari direktori itu dengan menggunakan
--transform
opsi konfigurasi, tetapi itu tidak menghilangkan.
direktori itu sendiri. Menjadi semakin sulit untuk menjinakkan perintah.Anda bisa menggunakan
$(find ...)
untuk menambahkan daftar file ke perintah (seperti dalam jawaban magnus ' ), tetapi itu berpotensi menyebabkan kesalahan "daftar file terlalu lama". Cara terbaik adalah menggabungkannya dengan-T
opsi tar , seperti ini:Pada dasarnya apa yang dilakukannya adalah mencantumkan semua file (
-type f
), tautan (-type l
) dan subdirektori (-type d
) di bawah direktori Anda, buat semua nama file relatif menggunakan-printf "%P\n"
, dan kemudian sampaikan ke perintah tar (dibutuhkan nama file dari STDIN menggunakan-T -
). The-C
opsi diperlukan agar tar tahu di mana file dengan nama yang relatif berada. The--no-recursion
bendera adalah agar tar tidak recurse ke folder itu diperintahkan untuk arsip (menyebabkan file duplikat).Jika Anda perlu melakukan sesuatu yang istimewa dengan nama file (memfilter, mengikuti symlinks dll),
find
perintahnya cukup kuat, dan Anda dapat mengujinya dengan hanya menghapustar
bagian dari perintah di atas:Misalnya jika Anda ingin memfilter file PDF, tambahkan
! -name '*.pdf'
Temuan non-GNU
Perintah ini menggunakan
printf
(tersedia di GNUfind
) yang memberitahufind
untuk mencetak hasilnya dengan jalur relatif. Namun, jika Anda tidak memiliki GNUfind
, ini berfungsi untuk membuat jalur relatif (menghilangkan orang tua dengansed
):sumber
Jawaban ini harus berfungsi dalam sebagian besar situasi. Namun perhatikan bagaimana nama file disimpan dalam file tar sebagai, misalnya,
./file1
bukan hanyafile1
. Saya menemukan bahwa ini menyebabkan masalah ketika menggunakan metode ini untuk memanipulasi tarball yang digunakan sebagai file paket di BuildRoot .Salah satu solusinya adalah menggunakan beberapa gumpalan Bash untuk mendaftar semua file kecuali untuk
..
seperti ini:Ini adalah trik yang saya pelajari dari jawaban ini .
Sekarang tar akan mengembalikan kesalahan jika tidak ada file yang cocok
..?*
atau.[^.]*
, tetapi masih akan berfungsi. Jika kesalahan adalah masalah (Anda memeriksa keberhasilan dalam skrip), ini berfungsi:Meskipun sekarang kita mengotak-atik opsi shell, kita mungkin memutuskan bahwa lebih baik untuk
*
mencocokkan file tersembunyi:Ini mungkin tidak berfungsi di mana shell Anda gumpal
*
di direktori saat ini, jadi alternatifnya, gunakan:sumber
tar: start.sh: Cannot stat: No such file or directory
Ini terjadi pada semua file di direktori saya saat ini! Bagaimana saya menghindari ini?sumber
Jika ini adalah sistem Unix / Linux, dan Anda peduli tentang file tersembunyi (yang akan dilewatkan oleh *), Anda perlu melakukan:
Saya tidak tahu seperti apa file tersembunyi di bawah Windows.
sumber
Saya akan mengusulkan fungsi Bash berikut (argumen pertama adalah path ke dir, argumen kedua adalah nama file dari arsip yang dihasilkan):
Anda dapat menjalankannya dengan cara ini:
dan itu akan menghasilkan arsip
my_archive.tar.gz
dalam direktori saat ini. Ia bekerja dengan elemen tersembunyi (. *) Dan dengan elemen dengan spasi di nama file mereka.sumber
Yang ini berfungsi untuk saya dan itu termasuk semua file tersembunyi tanpa meletakkan semua file di direktori root bernama "." seperti dalam jawaban tomoe :
sumber
Contoh:
Sama sama.
sumber
Inilah yang bekerja untuk saya.
Anda juga bisa menggunakannya
Pada perintah pertama, find mengembalikan daftar file dan sub-direktori my_dir . Namun, direktori my_dir dengan sendirinya termasuk dalam daftar itu sebagai '.' The -printf parameter menghilangkan path lengkap termasuk yang '' dan juga semuanyacrlf Namun demikian ruangdalam format string '% P' dari printf meninggalkan sisa dalam daftar file dan sub-direktori my_dir dan dapat dilihat oleh ruang terdepan di hasil perintah find .
Itu tidak akan menjadi masalah bagi TAR tetapi jika Anda ingin memperbaikinya, tambahkan -langkah 1 seperti pada perintah kedua.
sumber
Gunakan pax.
Pax adalah paket usang tetapi melakukan pekerjaan dengan sempurna dan dengan cara yang sederhana.
sumber
Cara paling sederhana yang saya temukan:
cd my_dir && tar -czvf ../my_dir.tar.gz *
sumber
Aman menangani nama file dengan spasi atau karakter tidak biasa lainnya. Anda bisa menambahkan
-name '*.sql'
filter atau sejenisnya ke perintah find untuk membatasi file yang disertakan.sumber
Jika folder tersebut mytemp maka jika Anda menerapkan hal di atas akan zip dan menghapus semua file dalam folder tetapi biarkan saja
Anda dapat memberikan pola kecualikan dan juga menentukan untuk tidak melihat subfolder juga
sumber
sumber