Ini harus melakukan trik:
tar -tzf archive.tar.gz | sed 's@^//*@@' | sort -r | xargs -d '\n' rm -d
Jika arsip Anda berisi jalur absolut dan Anda membukanya di lokasi absolut (untuk ini, Anda perlu menggunakan -P
opsi dari tar
) kamu harus pergi sed
. Anda juga bisa pergi sed
keluar, jika Anda benar-benar yakin bahwa tidak ada jalur absolut dalam arsip Anda.
tar -tzf archive.tar.gz | sort -r | xargs -d '\n' rm -d
Penjelasan
Anda bisa mendapatkan daftar file dalam arsip tar.gz dengan menggunakan -t
pilihan:
tar -tzf archive.tar.gz
Jika ada sedikit kemungkinan ada jalur absolut di arsip Anda dan Anda melakukannya tidak membongkar menggunakan -P
opsi untuk tar (yang akan membuka ke lokasi absolut alih-alih direktori saat ini atau yang diberikan), Anda perlu menghapus garis miring terkemuka dari daftar file, karena tar -tf
akan selalu menunjukkannya. sed
dapat membantu dengan itu:
tar -tzf archive.tar.gz | sed 's@^//*@@'
Membawa pola antara yang pertama dan yang kedua @
- ^//*
, yang cocok dengan satu atau lebih /
di awal baris - dan menggantinya dengan string antara yang kedua dan ketiga @
- dalam hal ini tanpa apa-apa, menghapus pertandingan dengan efektif.
Dengan xargs
Anda dapat menampilkan satu perintah sebagai argumen ke perintah lain:
tar -tzf archive.tar.gz | sed 's@^//*@@' | xargs -d '\n' rm
Ini mengambil daftar file, dibatasi oleh baris baru ( -d '\n'
) dan meneruskannya ke rm
. Ini akan menghapus file apa pun. Seperti biasa, direktori tidak akan dihapus dan Anda akan mendapatkan pesan kesalahan untuk masing-masing file.
Untuk mendapatkan direktori apa pun yang dibuat oleh pembongkaran sebelumnya, Anda harus menggunakannya rm -d
, yang juga akan dihapus kosong direktori. Output dari tar -t
biasanya dipesan berdasarkan abjad, yang berarti bahwa direktori mana pun akan terdaftar sebelum file di dalamnya. Ini berarti bahwa direktori tersebut belum kosong ketika rm
mencoba menghapusnya. Untuk menghindari masalah ini, kami gunakan saja sort -r
untuk menyusun ulang daftar dalam urutan abjad terbalik. Dengan begitu file apa pun dalam direktori akan dihapus sebelumnya rm
mencoba untuk menghapus direktori itu sendiri.
tar -tzf archive.tar.gz | sed 's@^//*@@' sort -r | xargs -d '\n' rm -d
Direktori yang berisi file yang tidak ada dalam arsip (misalnya jika direktori sudah ada dan berisi file sebelum membongkar) tidak akan dihapus. Tolong jangan gunakan rm -r
dari pada rm -d
karena itu juga dapat menghapus file dan direktori yang tidak ada dalam arsip.