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?
-
$ 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. -
Se piccola quantità di file estratti, uno per uno, lento, ingombrante e soggetto a errori.
-
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).