Linux gzip beberapa subdirektori ke arsip terpisah?

16

Bagaimana saya bisa memampatkan subdirektori ke arsip terpisah?

Contoh:

directory
 subdir1
 subdir2

Harus membuat subdir1 (.tar) .gz dan subdir2 (.tar) .gz

EarthMind
sumber

Jawaban:

27

Skrip kecil ini tampaknya menjadi pilihan terbaik Anda, mengingat persyaratan Anda:

cd directory
for dir in */
do
  base=$(basename "$dir")
  tar -czf "${base}.tar.gz" "$dir"
done

Itu benar menangani direktori dengan spasi di namanya.

Juliano
sumber
Ini memberi saya kesalahan ini: bash: -c: line 1: kesalahan sintaks: akhir file tak terduga
EarthMind
@EarthMind: Ini berfungsi dengan baik di sini. Periksa apakah skrip telah disalin dengan benar.
Juliano
@EarthMind: Saya tidak yakin Anda sudah menjawab pertanyaan aslinya dengan baik. Anda ingin menjalankan ini lagi dan mendapatkan file .tar.gz baru sambil meninggalkan file .tar.gz sebelumnya? Coba tambahkan "tmstamp = $ (tanggal '+% Y% m% d-% H% M')" dan ubah $ {base} menjadi $ {base} - $ {tmstamp}.
freiheit
2
@EarthMind: jika Anda akan meletakkan semuanya dalam satu baris, pastikan ada tanda titik koma (;) tepat sebelum perintah tar. Jika tidak, basis dilewatkan sebagai variabel lingkungan ke tar, alih-alih menjadi variabel tambahan shell.
Juliano
@ mwojtera hasil edit yang Anda coba harus jawabannya sendiri
chicks
10

Bagaimana dengan ini: find * -maxdepth 0 -type d -exec tar czvf {}.tar.gz {} \;

Penjelasan: Anda menjalankan pencarian pada semua item di direktori saat ini. Maxdepth 0 membuatnya tidak berulang lebih rendah dari argumen yang diberikan. (Dalam hal ini *, atau semua item dalam direktori Anda saat ini) Argumen 'd' untuk "-type" hanya cocok dengan direktori. Kemudian exec menjalankan tar pada pertandingan apa pun. ({} diganti dengan file yang cocok)

Christopher Karel
sumber
1
Tapi kemudian saya masih mendapatkan kesalahan bahwa jalur yang diberikan adalah direktori dan bukan file
EarthMind
3
gzip saja tidak mengarsipkan direktori
Juliano
Anda perlu membuat tar direktori sebelum dapat melakukan gzip.
ℝaphink
1
Anda perlu tar dengan opsi z, bukan gzip langsung untuk direktori. Penggunaan penemuan yang sangat bagus.
freiheit
3
Kesalahan: "find: path harus mendahului ekspresi:;" Bagian pertama berfungsi, jadi saya menggunakan (direktori saja): for dir in `find * -maxdepth 0 -type d`; do tar -cvzf ${dir}.tar.gz ${dir}; done
JosephK
4

Ini akan membuat file bernama blah.tar.gz untuk setiap file dalam direktori bernama bla.

$ cd directory
$ for dir in `ls`; do tar -cvzf ${dir}.tar.gz ${dir}; done

Jika Anda memiliki lebih dari sekadar direktori di direktori (yaitu file juga, karena ls akan mengembalikan semua yang ada di direktori), maka gunakan ini:

$ cd directory
$ for dir in `find . -maxdepth 1 -type d  | grep -v "^\.$" `; do tar -cvzf ${dir}.tar.gz ${dir}; done

Grep -v mengecualikan direktori saat ini yang akan muncul dalam findperintah secara default.

Philip Reynolds
sumber
3
Baik ls dan find TIDAK dibuat untuk digunakan dengan cara ini. Khususnya ls, ini dimaksudkan untuk menyajikan file dalam daftar yang dapat dibaca pengguna, bukan untuk menghasilkan daftar file sebagai argumen untuk 'untuk'. Cukup gunakanfor dir in *
Juliano
1
Saya sudah mencoba saran pertama Anda tetapi tidak berhasil dengan direktori yang berisi spasi dalam nama mereka
EarthMind
Selanjutnya, perintah pertama juga akan membuat tarball untuk setiap file di direktori.
ℝaphink