Cara menghapus semua file di folder yang ada di arsip tar.gz

0

Kesalahan umum bagi saya, adalah ekstraksi di direktori yang salah.

Setelah saya sadari, saya ingin menghapus semua file ini, dan ekstrak lagi.

Tetapi bagaimana cara mengotomatiskan operasi delete-all-this-crap ini?

Ada saran?

UPD: mesin linux (zsh)

Korjavin Ivan
sumber
Sistem operasi apa?
DavidPostill
Dan apakah Anda yakin tidak ada file dalam direktori yang juga ada sebelum mengekstraksi arsip? Atau ada file dengan nama yang sama yang ditimpa oleh file arsip?
Xen2050
maaf, linux, ya saya tetap file positif sudah mati
Korjavin Ivan

Jawaban:

1

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.

Adaephon
sumber
1
Pendekatan yang bagus. Tapi saya punya satu komentar: Anda harus sangat berhati-hati jika Anda memiliki arsip tar dengan nama path absolut ( -P ). Dalam hal itu (setidaknya versi saya) tar t ... daftar yang terkemuka /tapi tar c ... ekstrak file dengan slash utama dihapus. Jadi ada ketidaksesuaian dan Anda mengalami bahaya menghapus sesuatu yang tidak diinginkan.
mpy
Terima kasih @ mpy, tentu saja Anda benar. Saya mengedit jawaban saya sesuai dengan itu.
Adaephon