GNU/Linux >> Belajar Linux >  >> Linux

Cara De-unzip, De-tar -xvf — De-unarchive Di Folder Berantakan?

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?

  1. $ 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.

  2. Jika jumlah file yang diekstrak sedikit, satu per satu, lambat, tidak praktis, dan rawan kesalahan.

  3. 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).

Terkait:Windows – Folder bersama antara tamu QEMU Windows dan host Linux?
Linux
  1. Cara menggunakan FIND di Linux

  2. Cara menemukan File di Linux

  3. Bagaimana cara membuat find mengecualikan folder yang dicarinya?

  1. Cara Menggunakan Unzip di Linux

  2. Bagaimana saya bisa menemukan semua ekstensi file yang berbeda dalam hierarki folder?

  3. Bagaimana cara mengetahui status wlan0?

  1. Bagaimana saya bisa membuat file di setiap folder?

  2. Cara menggandakan folder dengan tepat

  3. Bagaimana menemukan versi Java mana di folder yang diinstal Java?