De nom
Vous pouvez générer la liste des fichiers dans l'archive et les supprimer, bien que cela soit fastidieusement fastidieux avec des archiveurs tels que décompresser 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
Utilisation de FUSE
Au lieu de dépendre d'outils externes, vous pouvez (sur la plupart des unités) utiliser FUSE pour manipuler des archives à l'aide de commandes de système de fichiers ordinaires.
Vous pouvez utiliser Fuse-zip pour jeter un œil à 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 l'ensemble de votre hiérarchie de répertoires où toutes les archives ont un répertoire associé (même nom avec # inséré à 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 distinguer les fichiers extraits par leur heure de connexion récente . 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 de coupure appropriée. Si vous voulez vous assurer de ne pas retirer les zips, il n'y a aucune raison de faire une approbation manuelle: find
est parfaitement capable de les exclure. Voici des exemples de commandes utilisant zsh ou find
; notez que les primaires -cmin
et -cnewer
ne sont pas en 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 de coupure est de créer un fichier et de l'utiliser touch
pour régler son mtime sur l'heure de coupure.
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 un moyen 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 les 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. Examinez toujours la liste des fichiers avant de les supprimer (exécutez d' echo
abord, puis rm
si c'est ok).