J'ai extrait un fichier zip dans un dossier non vide. Le fichier zip contient de nombreux fichiers et une hiérarchie profonde, qui ont fusionné avec l’arborescence existante du répertoire cible. Comment puis-je supprimer les fichiers et les répertoires qui ont été créés en décompressant sans détruire les fichiers et les répertoires déjà présents? Bien sûr, j'ai toujours le fichier zip que j'ai fusionné, donc les informations sont là.
52
lq
optionsunzizp
, j'ai juste ajouté quelques astuces classiques * nix autour de sa réponse principale.foo.tds.zip
forme. Ces zips se fondent dans un arbre TEXMF, ce qui est très pratique. Mais si vous souhaitez un jour supprimer un tel paquet, vous êtes confronté au problème que j'ai décrit.Réponses:
La réponse de jjlin est la voie à suivre. Je veux juste ajouter quelques choix pour les répertoires:
Supprimer tous les fichiers extraits , pas de répertoires :
Supprimer les fichiers extraits et les répertoires vides uniquement
En l'absence d'options,
rmdir
supprime uniquement les répertoires vides, les fichiers et les dossiers non vides seront laissés de manière à pouvoir les exécuter en toute sécurité*
.Supprimer tout extrait, mais demander une confirmation avant chaque suppression:
Le
-i
drapeau provoquerarm
une invite avant chaque suppression, vous pouvez choisir Oui ou Non.Supprimer tout extrait, répertoires inclus:
la source
find
:find * -depth -type d -exec rmdir {} +
et ignorer tous lesDirectory not empty
messages. Il est peut-être légal de raccourcir cette étapefind * -type d -delete
car l'-delete
option est activée,-depth
mais je n'ai pas vérifié que-delete
cela ne supprimerait pas un répertoire non vide.find: cannot delete './foo': Directory not empty
Vous pouvez utiliser
unzip -lqq <filename.zip>
pour lister le contenu du fichier zip; cela inclura toutefois des informations superflues que vous devrez filtrer. Voici une commande qui fonctionne pour moi:La
awk
commande extrait uniquement les noms des fichiers et des répertoires. Ensuite, le résultat est transmis àxargs
tout supprimer. Je suggère de commencer par exécuter une commande (en omettant laxargs rm -rf
partie) en premier pour vous assurer que les résultats sont corrects.La commande ci-dessus aura des problèmes avec les chemins qui ont des espaces. Cette version (plus compliquée) devrait résoudre ce problème:
la source
unzip -lqq
répertorie également les répertoires contenus dans le zip. Pour le moment, je laisserais tous les répertoires en solitaire. Comment supprimer tous les répertoires vides d'une arborescence pourrait être une question complémentaire.grep -v '/$'
dans le pipeline pour ignorer la suppression des répertoires (qui ont tous une barre oblique finale, AFAICT).awk
, car imprimer seulement 4 dollars n'imprimera pas le chemin complet.-r
option de rm: cela semble poser problème, en particulier lorsque l’-f
option est combinée . Je n'utiliserais pas l'-f
option du tout dans ce scénario.grep -v '/$'
que les entrées de répertoire dans le fichier ZIP. Ils incluront toujours des entrées qui étaient des fichiers simples dans le fichier ZIP mais qui étaient des répertoires préexistants dans le dossier cible. Pour cette raison, il serait sage d'omettre-r
Avec le commutateur
-Z1
, unzip listera exactement un fichier par ligne (et rien d’autre).De cette façon, vous pouvez utiliser
supprimer tous les fichiers extraits du fichier zip.
La commande
supprime également les répertoires, mais vous devez faire attention. Si les répertoires existaient déjà avant l'extraction du fichier zip, tous les fichiers préexistants de ces répertoires seront également supprimés.
Si vous voulez quand même ré-extraire le fichier zip, il existe une autre approche qui garantit de traiter les noms de fichiers étranges.
Commencez par extraire le fichier zip où vous vouliez l’extraire:
Maintenant, allez dans le répertoire où vous avez extrait les fichiers par erreur et exécutez la commande suivante:
-type f
ne trouve que des fichiers (pas de répertoires).%P\0
est le chemin relatif (sanselsewhere/
), suivi d'un caractère nul.-0
fait que xargs sépare les lignes par des caractères nuls. Ceci est plus fiable car - en théorie - les noms de fichiers peuvent contenir des caractères de nouvelle ligne.Pour gérer les répertoires restants, vous pouvez exécuter la commande:
-type d
ne trouve que des répertoires.-exec rmdir -p {} \;
s’exécutermdir -p {}
pour chaque répertoire trouvé.{}
est le répertoire qui a été trouvé et le-p
commutateur fait en sorte que rmdir supprime également ses répertoires parents vides.2> /dev/null
supprime les messages d'erreur résultant de la tentative de suppression de répertoires non vides ou précédemment supprimés.Pages de manuel connexes:
la source
zipinfo
la page de manuel de.Voici une solution encore plus facile et plus sûre (je pense)
Ce que cela fait: La commande unzip inversée produira une liste de ce qui était dans votre fichier d'origine.
zip -m utilisera ensuite cette liste pour ajouter add que chacun obtiendra getmeoutofhere.zip et le supprimera du répertoire d'origine (donc théoriquement, il devrait être indentif à myoriginalfile.zip.
L'inconvénient est que unzip -lqq produira du texte, des dates, des heures, une taille de fichier, etc. supplémentaires, ce qui obligera zip -m à produire des messages d'erreur, mais cela ne devrait pas avoir d'incidence (sauf si vous avez le cas improbable d'un fichier contenant le même fichier). Nom).
Veuillez noter que cela ne supprimera pas les répertoires créés lors de la décompression initiale.
la source
Si vous avez extrait les fichiers de telle sorte que l'horodatage de modification de l'archive ne soit pas conservé dans les copies extraites (mais que les fichiers extraits aient leur heure de modification habituelle), le bon moyen de l'attaquer est via l'heure de modification. Tous les fichiers extraits ont un horodatage de modification plus récent que le fichier existant le plus récemment modifié de ce répertoire.
Voici une situation simple.
Supposons qu'aucun des fichiers existants du répertoire en cours n'a été touché pendant au moins 24 heures. Tout ce qui a été modifié au cours des dernières 24 heures est donc indésirable à partir du fichier zip.
Cela trouvera aussi certains répertoires, mais
rm
les laissera seuls. Ils peuvent être traités dans un second passage:Tous les répertoires récemment modifiés ont été modifiés par le zip. Si vous
rmdir
les supprimez avec succès, cela signifie qu'ils sont vides. Les répertoires vides qui ont été touchés par zip ont probablement été créés par celui-ci: c’est-à-dire issus de l’archive. Nous ne pouvons pas être sûrs à 100%. Il est possible que le travail de décompression mette certains fichiers dans un répertoire existant qui était vide.Si
find
la granularité sur 24 heures ne convient pas au travail, car les fichiers de l’arborescence ont été modifiés trop récemment, je considérerai ensuite quelque chose de simple: supposons que le travail de décompression n’a placé aucun élément dans les sous-répertoires existants. C'est-à-dire que tout ce qui a été décompressé est soit un fichier au niveau supérieur, soit un nouveau sous-répertoire qui n'existait pas auparavant, qui ne contient donc que du matériel provenant du zip. Ensuite:Nous ouvrons maintenant
filelist
un éditeur de texte et déterminons la première entrée de la liste qui ne provient pas du zip. Nous supprimons cette entrée et tout le reste après. Il ne reste que les fichiers et répertoires issus du zip. Premièrement, nous inspectons visuellement des problèmes tels que des espaces dans les noms et des occurrences de citations à échapper. Nous pouvons ensuite ajouter des guillemets autour de tout, si nécessaire: Ce qui suit suppose que vous utilisez Vim:Puis joignez le tout dans une grande ligne:
Insérez maintenant
rm -rf
devant:Exécutez la ligne sous le curseur en tant que commande shell:
Je ne voudrais certainement pas automatiser les étapes de cette tâche, en raison du risque d'effacer des fichiers déjà présents ou de foirer en raison de problèmes de nom de fichier.
Si vous souhaitez obtenir une liste des chemins dans le fichier zip, capturez-le dans un fichier, examinez-le très attentivement et transformez-le en suppression après avoir effectué les modifications nécessaires.
la source