Saya baru saja membuka arsip yang menghasilkan kekacauan file ke direktori rapi saya. Sebagai contoh:
user@comp:~/tidy$ tar xvf myarchive.tar
file1
file2
dir1/
dir1/file1
dir1/subdir1/
dir1/subdir1/file1
dir2/
dir2/file1
...
Saya berharap bahwa file tar akan diatur dalam satu folder (mis., myarchive/
), tapi ternyata tidak! Sekarang saya memiliki sekitar 190 file dan direktori yang secara digital muntah dalam apa yang merupakan direktori yang terorganisir. File-file yang belum diarsipkan ini perlu dibersihkan.
Apakah ada cara untuk "membatalkan" ini dan menghapus file dan direktori yang diambil dari arsip ini?
Terima kasih atas jawaban yang sangat baik di bawah ini. Singkatnya , inilah yang berfungsi dengan dua langkah (1) menghapus file, dan (2) menghapus struktur direktori kosong dalam urutan pengemasan terbalik (untuk menghapus direktori luar terlebih dahulu):
tar tf myarchive.tar | xargs -d'\n' rm
tar tf myarchive.tar | tac | xargs -d'\n' rmdir
Dan lebih aman lagi, untuk melihat pratinjau perintah yang dijalankan dengan menambahkan echo
setelah xargs
.
xargs
(tac
dari padasort -r
hanya kosmetik), tetapi Anda menerima jawaban dengan proses substitusi yang, seperti yang Anda jelaskan di komentar, tidak cocok untuk Anda? Juga, tolong berixargs -d'\n'
beralih di posting Anda jika Anda ingin merangkum untuk pengguna masa depan, sehingga mereka tidak akan digigit oleh spasi dalam nama file.-d'\n'
sampai sekarang, dan setelah dianalisis lebih lanjut, jawaban Anda sebenarnya mendekati apa yang saya gunakan.-d'\n'
terletak pada kenyataan bahwa jika Anda tidak memberi tahuxargs
untuk membagi argumen pada baris baru (yang Anda beri makan) tetapi pada spasi, lalu file dengan namafolder1/some file
akan dibaca sebagaifolder1/some
danname
.Jawaban:
akan mencantumkan konten baris demi baris.
Ini dapat disalurkan ke
xargs
secara langsung, tetapi Waspadalah : lakukan penghapusan dengan sangat hati-hati. Kamu jangan ingin adilrm -r
semua itutar tf
memberitahu Anda, karena itu mungkin termasuk direktori yang tidak kosong sebelum membongkar!Anda bisa melakukannya
untuk pertama menghapus semua file yang ada di arsip, dan kemudian direktori yang dibiarkan kosong.
sort -r
(saran glennjackmantac
dari padasort -r
di komentar untuk jawaban yang diterima, yang juga berfungsi sejak saat itutar
Output cukup reguler) diperlukan untuk menghapus direktori terdalam terlebih dahulu; jika tidak demikian halnyadir1
berisi satu direktori kosongdir2
akan meninggalkandir1
setelahrmdir
lulus, karena itu tidak kosong sebelumnyadir2
telah dihapus.Ini akan menghasilkan banyak
dan
Tutup ini dengan
2>/dev/null
jika itu mengganggu Anda, tapi saya lebih suka menyimpan informasi sebanyak mungkin pada proses.Dan jangan lakukan itu sampai Anda yakin bahwa Anda cocok dengan file yang tepat. Dan mungkin mencoba
rm -i
untuk mengkonfirmasi semuanya. Dan memiliki cadangan, makan sarapan, menyikat gigi, dll.sumber
-d'\n'
opsi untukxargs
.xargs
tidak punya-d
, jadi Anda perlu varian GNU jika Anda adalah orang miskin seperti saya.Daftar isi file tar seperti ini:
Kemudian, hapus nama-nama file dengan mengulangi daftar itu:
Ini akan tetap adil daftar file yang akan dihapus. Menggantikan
echo
denganrm
jika Anda benar-benar yakin ini adalah yang ingin Anda hapus. Dan mungkin membuat cadangan untuk memastikan.Dalam pass kedua, hapus direktori yang tersisa:
Ini mencegah direktori dengan dihapus jika sudah ada sebelumnya.
Trik bagus lainnya oleh @glennjackman, yang menjaga urutan file, mulai dari yang terdalam. Sekali lagi, hapus
echo
ketika selesai.Ini kemudian bisa diikuti oleh yang normal
rmdir
membersihkan.sumber
while
untuk mengulang set rekaman. Baru terbiasa. @ stérm -rf
dapat menghapus file yang bukan dari arsip tetapi di dalam direktori yang memiliki nama yang sama dengan yang ada di arsip. Lebih baik berhati-hati di sini dan gunakanrmdir
di umpan kedua.rmdir
perlu dijalankan untuk setiap tingkat sarang direktori. Jadi itu akan bersihsubdir1
pada pass pertama, tetapi pergidir1
karena mencoba menghapus ini terlebih dahulu ketika tidak kosong pada saat itu. Perintah ini dapat dilakukan sekali jika daftar file dapat diurutkan mundur.tar tvf arch.tar | tac | xargs echo rm
(hapus gema saat Anda yakin)Berikut adalah kemungkinan yang akan mengambil file yang diekstrak dan memindahkannya ke subdirektori, membersihkan folder utama Anda.
Simpan ini ke file
fix-tar.pl
dan kemudian jalankan seperti ini:Ini akan mengkonfirmasi bahwa Anda
tar
daftar seperti milikku. Anda harus mendapatkan output seperti:Jika itu terlihat bagus, jalankan lagi seperti ini:
Itu
fixup.sh
script akan menjadi perintah shell yang akan memindahkan file tingkat atas dan direktori ke folder "bersih" (dalam hal ini, folder bernamacleanup
). Lihat sekilas skrip ini untuk memastikan bahwa semuanya halal. Jika ya, Anda sekarang dapat membersihkan kekacauan Anda dengan:Saya lebih suka pembersihan seperti ini karena tidak merusak apa pun yang belum dihancurkan dengan ditimpa oleh inisial itu
tar xv
.Catatan: jika output awal kering tidak terlihat benar, Anda harus bisa mengutak-atik angka dalam keduanya
substr
panggilan fungsi sampai terlihat layak. Itu$perms
variabel hanya digunakan untuk dry run jadi hanya benar - benar$dirent
Substring harus tepat.Satu hal lagi: Anda mungkin perlu menggunakan
tar
pilihan--numeric-owner
jika nama pengguna dan / atau nama grup dalamtar
daftar membuat nama dimulai pada kolom yang tidak dapat diprediksi.sumber
Jenis arsip (antisosial) semacam itu disebut bom tar karena fungsinya. Setelah salah satu dari "meledak" pada Anda, solusi dalam jawaban lain jauh lebih baik daripada apa yang saya sarankan.
"Solusi" terbaik, bagaimanapun, adalah untuk mencegah masalah sejak awal.
Cara termudah (malas) untuk melakukannya adalah dengan selalu membongkar arsip tar ke direktori kosong. Jika itu termasuk direktori tingkat atas, maka Anda tinggal memindahkannya ke tujuan yang diinginkan. Jika tidak, maka cukup ganti nama direktori kerja Anda (yang kosong) dan pindahkan ke lokasi yang diinginkan.
Jika Anda hanya ingin memperbaikinya pertama kali, Anda dapat menjalankan tar -tvf archive-file.tar | kurang dan itu akan mencantumkan isi arsip sehingga Anda dapat melihat bagaimana itu disusun dan kemudian melakukan apa yang diperlukan untuk mengekstraknya ke lokasi yang diinginkan untuk memulai.
Opsi t juga berguna jika Anda ingin memeriksa isi arsip hanya untuk melihat apakah ada sesuatu yang Anda cari di dalamnya. Jika ya, Anda dapat, secara opsional, mengekstrak file yang Anda inginkan.
sumber