GNU/Linux >> Tutoriels Linux >  >> Linux

Comment décompresser, détarer -xvf - désarchiver dans un dossier désordonné ?

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 ?

  1. $ 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.

  2. S'il s'agit d'une petite quantité de fichiers extraits, un par un, lent, fastidieux et sujet aux erreurs.

  3. 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).

Connexe :Windows - Dossier partagé entre l'invité Windows QEMU et l'hôte Linux ?
Linux
  1. Comment utiliser FIND sous Linux

  2. Comment utiliser Décompresser sous Linux

  3. Comment trouver un fichier sous Linux

  4. Comment puis-je faire en sorte que find exclut le dossier dans lequel il recherche?

  5. Comment trouver le statut de wlan0?

Comment trouver une adresse IP sous Linux

Comment trouver le nom d'hôte sous Linux

Comment compresser des fichiers et des dossiers sous Linux [Astuce pour débutant]

Comment compresser un dossier sous Linux

Comment compresser des fichiers et des dossiers sous Linux

Comment trouver des fichiers dans Debian