Habituellement, je désarchive les choses par $ mkdir newFolder; $ mv *.zip newFolder; $ cd newFolder; $unzip *.zip
mais parfois je deviens paresseux et je fais juste dans un dossier arbitraire $ unzip *.zip
donc gâcher de temps en temps avec d'autres contenus. Je vais énumérer ici quelques méthodes - certaines versions d'archives ont sûrement des drapeaux merdiques tandis que d'autres sont plus spartiates, je suis plus intéressé par ces dernières.
Certaines façons de désarchiver, y en a-t-il d'autres ?
-
$ find . -anewer fileThatExistedBeforeUnarchieving -ok rm '{}' ;
Les faiblesses sont qu'il répertorie le*.zip
dirs, vous devez donc utiliser lent-ok
, lent avec beaucoup de*.zip
correspond et, pour une raison quelconque, il ne semble pas correspondre à tout ce qui est extrait. -
S'il s'agit d'une petite quantité de fichiers extraits, un par un, lent, fastidieux et sujet aux erreurs.
-
Lorsque je veux m'assurer que le contenu de l'archive est bien un dossier, je le vérifie parfois avec
$ unzip -l *.bsd
, fonctionne au moins dans la version décompressée d'obsd.
Si vous faites référence à certains outils d'archivage, veuillez les indiquer le cas échéant. Restez simple cependant - je suis plus intéressé par les FAÇONS dont vous le faites, plutôt que par un seul outil.
Réponse acceptée :
Par nom
Vous pouvez générer la liste des fichiers dans l'archive et les supprimer, bien que cela soit fastidieux avec des archiveurs tels que unzip ou 7z qui n'ont pas la possibilité de générer une liste simple de noms de fichiers. Même avec tar, cela suppose qu'il n'y a pas de nouvelle ligne dans les noms de fichiers.
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
Au lieu de supprimer les fichiers, vous pouvez les déplacer vers leur destination prévue.
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
Utiliser FUSE
Au lieu de dépendre d'outils externes, vous pouvez (sur la plupart des unix) utiliser FUSE pour manipuler des archives à l'aide de commandes de système de fichiers ordinaires.
Vous pouvez utiliser Fuse-zip pour jeter un coup d'œil dans un zip, l'extraire avec cp
, lister son contenu avec find
, etc.
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 crée une vue de toute votre hiérarchie de répertoires où toutes les archives ont un répertoire associé (même nom avec # ajouté à la fin) qui semble contenir le contenu de l'archive.
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
Par date
En supposant qu'il n'y a pas eu d'autre activité dans la même hiérarchie que votre extraction, vous pouvez identifier les fichiers extraits par leur récent ctime . Si vous venez de créer ou de déplacer le fichier zip, vous pouvez l'utiliser comme coupure; sinon, utilisez ls -lctr
pour déterminer une heure limite appropriée. Si vous voulez vous assurer de ne pas supprimer les zips, il n'y a aucune raison de procéder à une approbation manuelle :find
est parfaitement capable de les exclure. Voici des exemples de commandes utilisant zsh ou find
; notez que le -cmin
et -cnewer
les primaires ne sont pas dans POSIX mais existent sur Linux (et d'autres systèmes avec GNU find), *BSD et 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
Avec GNU find, FreeBSD et OSX, une autre façon de spécifier l'heure limite est de créer un fichier et d'utiliser touch
pour régler son mtime sur l'heure limite.
touch -d … cutoff
find . -type f -newercm cutoff -delete
Au lieu de supprimer les fichiers, vous pouvez les déplacer vers leur destination prévue. Voici une méthode avec GNU/*BSD/OSX find, en créant des répertoires dans la destination selon les besoins.
find . ! -name . -cmin -5 -type f -exec sh -c '
for x; do
mkdir -p "$0/${x%/*}"
mv "$x" "$0/$x"
done
' /intended/destination {} +
Équivalent Zsh (presque :celui-ci reproduit toute la hiérarchie des répertoires, pas seulement les répertoires qui contiendront des fichiers) :
autoload zmv
mkdir -p ./**/*(/cm-3:s"|.|/intended/destination|")
zmv -Q '(**/)(*)(.cm-3)' /intended/destination/'$1$2'
Attention, je n'ai pas testé la plupart des commandes de cette réponse. Vérifiez toujours la liste des fichiers avant de les supprimer (exécutez echo
d'abord, puis rm
si c'est bon).