Namentlich
Sie können die Liste der Dateien im Archiv generieren und löschen, was bei Archiven wie unzip oder 7z, die keine Option zum Generieren einer einfachen Liste von Dateinamen haben, ärgerlich ist. Selbst mit tar wird davon ausgegangen, dass die Dateinamen keine Zeilenumbrüche enthalten.
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
Anstatt die Dateien zu entfernen, können Sie sie an den gewünschten Ort verschieben.
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
FUSE verwenden
Anstatt von externen Tools abhängig zu sein, können Sie (bei den meisten Unices) FUSE verwenden , um Archive mit normalen Dateisystembefehlen zu bearbeiten.
Sie können Fuse-zip verwenden, um einen Blick in ein Zip zu werfen, es mit zu extrahieren cp
, seinen Inhalt mit aufzulisten find
usw.
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 erstellt eine Ansicht Ihrer gesamten Verzeichnishierarchie, in der allen Archiven ein Verzeichnis zugeordnet ist (derselbe Name mit # am Ende), das den Archivinhalt zu enthalten scheint.
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
Nach Datum
Angenommen, es gibt keine anderen Aktivitäten in derselben Hierarchie als Ihre Extraktion, können Sie die extrahierten Dateien anhand ihrer letzten C-Zeit ermitteln . Wenn Sie die ZIP-Datei gerade erstellt oder verschoben haben, können Sie sie als Cutoff verwenden. Andernfalls verwenden Sie ls -lctr
, um eine geeignete Abschaltzeit zu bestimmen. Wenn Sie sicherstellen möchten, dass die Reißverschlüsse nicht entfernt werden, gibt es keinen Grund für eine manuelle Genehmigung: Sie können sie find
durchaus ausschließen. Hier sind Beispielbefehle mit zsh oder find
; Beachten Sie, dass die -cmin
und -cnewer
-Primäre nicht in POSIX, sondern unter Linux (und anderen Systemen mit GNU find), * BSD und OSX vorhanden sind.
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
Mit GNU find, FreeBSD und OSX können Sie die Cutoff-Zeit auch festlegen, indem Sie eine Datei erstellen und touch
deren mtime auf die Cutoff-Zeit setzen.
touch -d … cutoff
find . -type f -newercm cutoff -delete
Anstatt die Dateien zu entfernen, können Sie sie an den gewünschten Ort verschieben. Hier ist ein Weg mit GNU / * BSD / OSX zu finden, Verzeichnisse im Ziel zu erstellen, wie benötigt.
find . \! -name . -cmin -5 -type f -exec sh -c '
for x; do
mkdir -p "$0/${x%/*}"
mv "$x" "$0/$x"
done
' /intended/destination {} +
Zsh-Äquivalent (fast: dieses gibt die gesamte Verzeichnishierarchie wieder, nicht nur die Verzeichnisse, die Dateien enthalten):
autoload zmv
mkdir -p ./**/*(/cm-3:s"|.|/intended/destination|")
zmv -Q '(**/)(*)(.cm-3)' /intended/destination/'$1$2'
Achtung, ich habe die meisten Befehle in dieser Antwort nicht getestet. Überprüfen Sie immer die Liste der Dateien, bevor Sie sie entfernen ( echo
zuerst ausführen , dann, rm
wenn es in Ordnung ist).