GNU/Linux >> Linux Esercitazione >  >> Linux

Come De-decomprimere, De-tar -xvf — De-unarchive in una cartella disordinata?

Di solito estraggo le cose da $ mkdir newFolder; $ mv *.zip newFolder; $ cd newFolder; $unzip *.zip ma a volte divento pigro e faccio semplicemente in una cartella arbitraria $ unzip *.zip così di tanto in tanto pasticciare con altri contenuti. Elencherò qui alcuni metodi:alcune versioni di archivio hanno sicuramente flag di merda mentre altre più spartane, sono più interessato a quest'ultimo.

Alcuni modi per de-unarchive, ce ne sono altri?

  1. $ find . -anewer fileThatExistedBeforeUnarchieving -ok rm '{}' ; I punti deboli sono che elenca il *.zip dirs, quindi devi usare -ok lento , lento con molti *.zip corrisponde e, per qualche motivo, non sembra corrispondere a tutto ciò che è stato estratto.

  2. Se piccola quantità di file estratti, uno per uno, lento, ingombrante e soggetto a errori.

  3. Quando voglio essere sicuro che il contenuto dell'archivio sia effettivamente una cartella, a volte lo controllo con $ unzip -l *.bsd , funziona almeno nella versione unzip di obsd.

Se ti riferisci a determinati strumenti di archiviazione, ti preghiamo di indicarli quando appropriato. Sii semplice però:sono più interessato ai MODI in cui lo fai, piuttosto che a un singolo strumento.

Risposta accettata:

Per nome

Puoi generare l'elenco dei file nell'archivio ed eliminarli, anche se questo è fastidiosamente complicato con archivi come unzip o 7z che non hanno un'opzione per generare un semplice elenco di nomi di file. Anche con tar, questo presuppone che non ci siano nuove righe nei nomi dei 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

Invece di rimuovere i file, puoi spostarli nella destinazione prevista.

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

Utilizzo di FUSE

Invece di dipendere da strumenti esterni, puoi (sulla maggior parte degli Unice) usare FUSE per manipolare gli archivi usando i normali comandi del filesystem.

Puoi usare Fuse-zip per sbirciare in uno zip, estrarlo con cp , elenca il suo contenuto con find , ecc.

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 crea una vista dell'intera gerarchia di directory in cui tutti gli archivi hanno una directory associata (lo stesso nome con # aggiunto alla fine) che sembra contenere il contenuto dell'archivio.

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

Per data

Supponendo che non ci siano state altre attività nella stessa gerarchia rispetto alla tua estrazione, puoi distinguere i file estratti dal loro recente ctime . Se hai appena creato o spostato il file zip, puoi usarlo come interruzione; altrimenti usa ls -lctr per determinare un tempo limite adeguato. Se vuoi assicurarti di non rimuovere le zip, non c'è motivo di fare alcuna approvazione manuale:find è perfettamente in grado di escluderli. Ecco alcuni esempi di comandi che utilizzano zsh o find; nota che il -cmin e -cnewer i primari non sono in POSIX ma esistono su Linux (e altri sistemi con GNU find), *BSD e 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

Con GNU find, FreeBSD e OSX, un altro modo per specificare il tempo limite è creare un file e usare touch per impostare il suo tempo sull'ora limite.

touch -d … cutoff
find . -type f -newercm cutoff -delete

Invece di rimuovere i file, puoi spostarli nella destinazione prevista. Ecco un modo con GNU/*BSD/OSX find, creando directory nella destinazione secondo necessità.

find . ! -name . -cmin -5 -type f -exec sh -c '
    for x; do
      mkdir -p "$0/${x%/*}"
      mv "$x" "$0/$x"
    done
  ' /intended/destination {} +

Equivalente Zsh (quasi:questo riproduce l'intera gerarchia delle directory, non solo le directory che conterranno i file):

autoload zmv
mkdir -p ./**/*(/cm-3:s"|.|/intended/destination|")
zmv -Q '(**/)(*)(.cm-3)' /intended/destination/'$1$2'

Attenzione, non ho testato la maggior parte dei comandi in questa risposta. Rivedi sempre l'elenco dei file prima di rimuoverli (esegui echo prima, poi rm se va bene).

Correlati:Windows – Cartella condivisa tra il guest QEMU Windows e l'host Linux?
Linux
  1. Come usare TROVA in Linux

  2. Come usare Unzip in Linux

  3. Come trovare un file in Linux

  4. Linux:come trovare quale versione di Java nella cartella installata di Java?

  5. Come trovare lo stato di wlan0?

Come trovare l'indirizzo IP in Linux

Come trovare il nome host in Linux

Come comprimere file e cartelle in Linux [Suggerimento per principianti]

Come comprimere la cartella su Linux

Come comprimere file e cartelle in Linux

Come trovare file in Debian