GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie de-unzip, De-tar -xvf — De-unarchive in einem chaotischen Ordner?

Normalerweise dearchiviere ich Dinge mit $ mkdir newFolder; $ mv *.zip newFolder; $ cd newFolder; $unzip *.zip aber manchmal werde ich faul und mache einfach in einem beliebigen Ordner $ unzip *.zip also von Zeit zu Zeit mit anderen Inhalten durcheinander gebracht. Ich werde hier einige Methoden auflisten – einige Archivversionen haben sicherlich beschissene Flaggen, während andere spartanischer sind, letzteres interessiert mich mehr.

Einige Möglichkeiten zum De-Unarchivieren, gibt es andere?

  1. $ find . -anewer fileThatExistedBeforeUnarchieving -ok rm '{}' ; Schwächen sind, dass es den *.zip auflistet dirs, also müssen Sie langsam -ok verwenden , langsam bei vielen *.zip Übereinstimmungen, und aus irgendeinem Grund scheint es nicht mit allem, was extrahiert wurde, übereinzustimmen.

  2. Wenn es sich um eine kleine Menge extrahierter Dateien handelt, einzeln, langsam, umständlich und fehleranfällig.

  3. Wenn ich mich vergewissern möchte, ob der Inhalt des Archivs tatsächlich ein Ordner ist, überprüfe ich das manchmal mit $ unzip -l *.bsd , funktioniert zumindest in der unzip-Version von obsd.

Wenn Sie sich auf bestimmte Archivierungstools beziehen, geben Sie diese bitte an entsprechender Stelle an. Halten Sie es jedoch einfach – ich interessiere mich mehr für die WEGE, wie Sie es tun, als für ein einzelnes Tool.

Akzeptierte Antwort:

Nach Namen

Sie können die Liste der Dateien im Archiv generieren und löschen, obwohl dies bei Archivierern wie unzip oder 7z, die keine Option zum Generieren einer einfachen Liste von Dateinamen haben, ärgerlich fummelig ist. Selbst bei tar setzt dies voraus, dass 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 auch an ihren vorgesehenen Zielort 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

Verwendung von FUSE

Anstatt auf externe Tools angewiesen zu sein, können Sie (auf den meisten Unices) FUSE verwenden, um Archive mit gewöhnlichen Dateisystembefehlen zu manipulieren.

Sie können Fuse-zip verwenden, um in eine ZIP-Datei zu schauen und sie mit cp zu extrahieren , listen Sie seinen Inhalt mit find auf 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 alle Archive ein zugehöriges Verzeichnis (gleicher Name mit angehängtem # am Ende) haben, 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 gab keine andere Aktivität in derselben Hierarchie als Ihre Extraktion, können Sie die extrahierten Dateien anhand ihrer letzten ctime erkennen . Wenn Sie die ZIP-Datei gerade erstellt oder verschoben haben, können Sie sie als Cutoff verwenden. Verwenden Sie andernfalls ls -lctr um eine geeignete Cutoff-Zeit zu bestimmen. Wenn Sie sicherstellen möchten, dass die Reißverschlüsse nicht entfernt werden, gibt es keinen Grund, eine manuelle Genehmigung vorzunehmen:find durchaus in der Lage ist, sie auszuschließen. Hier sind Beispielbefehle mit zsh oder find; Beachten Sie, dass die -cmin und -cnewer Vorwahlen sind nicht in POSIX, existieren aber unter Linux (und anderen Systemen mit GNU find), *BSD und 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

Mit GNU find, FreeBSD und OSX besteht eine andere Möglichkeit, die Cutoff-Zeit anzugeben, darin, eine Datei zu erstellen und touch zu verwenden um seine mtime auf die Cutoff-Zeit zu setzen.

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

Anstatt die Dateien zu entfernen, können Sie sie an ihren vorgesehenen Bestimmungsort verschieben. Hier ist eine Möglichkeit mit GNU/*BSD/OSX find, Verzeichnisse im Ziel nach Bedarf zu erstellen.

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 reproduziert die gesamte Verzeichnishierarchie, 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 (führen Sie echo aus zuerst, dann rm wenn es in Ordnung ist).

Siehe auch:Windows – Gemeinsamer Ordner zwischen QEMU-Windows-Gast und Linux-Host?
Linux
  1. So verwenden Sie FIND unter Linux

  2. So finden Sie eine Datei in Linux

  3. Linux – So finden Sie die Java-Version im installierten Java-Ordner

  4. Wie finde ich alle unterschiedlichen Dateierweiterungen in einer Ordnerhierarchie?

  5. So duplizieren Sie einen Ordner genau

So finden Sie die IP-Adresse unter Linux

So finden Sie den Hostnamen unter Linux

So zippen Sie Dateien und Ordner in Linux [Anfängertipp]

So komprimieren Sie Ordner unter Linux

So komprimieren Sie Dateien und Ordner unter Linux

So finden Sie Dateien in Debian