Biasanya, saya membuka arsip sesuatu dengan $ mkdir newFolder; $ mv *.zip newFolder; $ cd newFolder; $unzip *.zip
tapi terkadang saya malas dan hanya melakukan di sembarang folder $ unzip *.zip
jadi dari waktu ke waktu mengacaukan konten lain. Saya akan membuat daftar di sini beberapa metode — beberapa versi arsip pasti memiliki flag yang jelek sementara yang lain lebih sederhana, saya lebih tertarik dengan yang terakhir.
Beberapa cara untuk membatalkan pengarsipan, apakah ada cara lain?
-
$ find . -anewer fileThatExistedBeforeUnarchieving -ok rm '{}' ;
Kelemahannya adalah mencantumkan*.zip
dirs, jadi Anda perlu menggunakan-ok
slow yang lambat , lambat dengan banyak*.zip
cocok dan, untuk beberapa alasan, sepertinya tidak cocok dengan semua yang diekstraksi. -
Jika jumlah file yang diekstrak sedikit, satu per satu, lambat, tidak praktis, dan rawan kesalahan.
-
Ketika saya ingin memastikan apakah isi arsip itu benar-benar folder, saya terkadang memeriksanya dengan
$ unzip -l *.bsd
, bekerja setidaknya dalam versi unzip obsd.
Jika Anda mengacu pada alat pengarsipan tertentu, harap sebutkan jika perlu. Tetap sederhana — saya lebih tertarik dengan CARA bagaimana Anda melakukannya, daripada satu alat.
Jawaban yang Diterima:
Dengan nama
Anda dapat membuat daftar file dalam arsip dan menghapusnya, meskipun ini mengganggu pengarsipan seperti unzip atau 7z yang tidak memiliki opsi untuk membuat daftar nama file biasa. 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 dapat memindahkannya ke tujuan yang diinginkan.
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 eksternal, Anda dapat (pada kebanyakan unix) menggunakan FUSE untuk memanipulasi arsip menggunakan perintah sistem file biasa.
Anda dapat menggunakan Fuse-zip untuk mengintip ke dalam zip, ekstrak dengan cp
, daftarkan isinya dengan 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 # tertempel 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
Menurut tanggal
Dengan asumsi tidak ada aktivitas lain dalam hierarki yang sama selain ekstraksi Anda, Anda dapat memberi tahu file yang diekstraksi berdasarkan waktu terbarunya . Jika Anda baru saja membuat atau memindahkan file zip, Anda dapat menggunakannya sebagai cutoff; jika tidak gunakan ls -lctr
untuk menentukan cut off time yang sesuai. Jika Anda ingin memastikan untuk tidak melepas ritsleting, tidak ada alasan untuk melakukan persetujuan manual:find
sangat mampu mengecualikan mereka. Berikut adalah contoh perintah menggunakan zsh atau find
; perhatikan bahwa -cmin
dan -cnewer
primer tidak ada 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 batas waktu adalah dengan membuat file dan menggunakan touch
untuk menyetel mtime ke waktu cutoff.
touch -d … cutoff
find . -type f -newercm cutoff -delete
Alih-alih menghapus file, Anda dapat memindahkannya ke tujuan yang diinginkan. Berikut cara dengan GNU/*BSD/OSX find, 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
pertama, lalu rm
jika tidak apa-apa).