Dengan nama
Anda dapat membuat daftar file dalam arsip dan menghapusnya, meskipun ini mengganggu dengan pengarsipan seperti unzip atau 7z yang tidak memiliki opsi untuk menghasilkan daftar nama file yang sederhana. Bahkan dengan tar, ini mengasumsikan tidak ada baris baru dalam nama file.
tar tf foo.tar | while read -r file; do rm -- "$file" done
unzip -l foo.zip | awk '
p && /^ --/ {p=2}
p==1 {print substr($0, 29)}
/^ --/ {++p}
' | while …
unzip -l foo.zip | tail -n +4 | head -n -2 | while … # GNU coreutils only
7z l -slt foo.zip | sed -n 's/^Path = //p' | while … # works on tar.*, zip, 7z and more
Alih-alih menghapus file, Anda bisa memindahkannya ke tujuan yang dituju.
tar tf foo.tar | while read -r file; do
if [ -d "$file" ]; then continue; fi
mkdir -p "/intended/destination/${file%/*}"
mv -- "$file" "/intended/destination/$file"
done
Menggunakan FUSE
Alih-alih bergantung pada alat-alat eksternal, Anda dapat (pada sebagian besar unit) menggunakan FUSE untuk memanipulasi arsip menggunakan perintah sistem file biasa.
Anda dapat menggunakan Fuse-zip untuk mengintip ke dalam zip, ekstrak dengan cp
, daftar isinya find
, dll.
mkdir /tmp/foo.d
fuse-zip foo.zip /tmp/foo.d
## Remove the files that were extracted mistakenly (GNU/BSD find)
(cd /tmp/foo.d && find . \! -type d -print0) | xargs -0 rm
## Remove the files that were extracted mistakenly (zsh)
rm /tmp/foo.d/**(:"s~/tmp/foo.d/~~"^/)
## Extract the contents where you really want them
cp -Rp /tmp/foo.d /intended/destination
fusermount -u foo.d
rmdir foo.d
AVFS membuat tampilan seluruh hierarki direktori Anda di mana semua arsip memiliki direktori terkait (nama yang sama dengan # ditempel di bagian akhir) yang tampaknya menyimpan konten arsip.
mountavfs
## Remove the files that were extracted mistakenly (GNU/BSD find)
(cd ~/.avfs/"$PWD/foo.zip#" && find . \! -type d -print0) | xargs -0 rm
## Remove the files that were extracted mistakenly (zsh)
rm ~/.avfs/$PWD/foo.zip\#/**/*(:"s~$HOME/.avfs/$PWD/foo.zip#~~"^/)
## Extract the contents where you really want them
cp -Rp ~/.avfs/"$PWD/foo.zip#" /intended/destination
umountavfs
Tanggal
Dengan asumsi belum ada lain setiap kegiatan dalam hierarki yang sama dari ekstraksi Anda, Anda dapat memberitahu file diekstrak dengan terbaru mereka kriminal . Jika Anda baru saja membuat atau memindahkan file zip, Anda dapat menggunakannya sebagai cutoff; jika tidak gunakan ls -lctr
untuk menentukan waktu cutoff yang cocok. Jika Anda ingin memastikan untuk tidak menghapus ritsleting, tidak ada alasan untuk melakukan persetujuan manual: find
sangat mampu mengeluarkannya . Berikut adalah contoh perintah menggunakan zsh atau find
; perhatikan bahwa primary -cmin
dan -cnewer
tidak di POSIX tetapi ada di Linux (dan sistem lain dengan GNU find), * BSD dan OSX.
find . \! -name '*.zip' -type f -cmin -5 -exec rm {} + # extracted <5 min ago
rm **/*~*.zip(.cm-6) # zsh, extracted ≤5 min ago
find . -type f -cnewer foo.zip -exec rm {} + # created or moved after foo.zip
Dengan GNU find, FreeBSD dan OSX, cara lain untuk menentukan waktu cutoff adalah dengan membuat file dan menggunakannya touch
untuk mengatur waktu ke waktu cutoff.
touch -d … cutoff
find . -type f -newercm cutoff -delete
Alih-alih menghapus file, Anda bisa memindahkannya ke tujuan yang dituju. Inilah cara menemukan GNU / * BSD / OSX, membuat direktori di tujuan sesuai kebutuhan.
find . \! -name . -cmin -5 -type f -exec sh -c '
for x; do
mkdir -p "$0/${x%/*}"
mv "$x" "$0/$x"
done
' /intended/destination {} +
Setara dengan Zsh (hampir: yang ini mereproduksi seluruh hierarki direktori, bukan hanya direktori yang akan berisi file):
autoload zmv
mkdir -p ./**/*(/cm-3:s"|.|/intended/destination|")
zmv -Q '(**/)(*)(.cm-3)' /intended/destination/'$1$2'
Peringatan, saya belum menguji sebagian besar perintah dalam jawaban ini. Selalu tinjau daftar file sebelum menghapus (jalankan echo
dulu, lalu rm
jika tidak apa-apa).