Question de ligne de commande Zip

0

J'ai une machine Windows avec une structure de répertoires contenant des fichiers avec une extension particulière. J'ai besoin d'un script qui va ajouter un fichier compressé pour chaque fichier avec cette extension. Est-il possible de faire cela avec 7 Zip (7za.exe)? Si non, y a-t-il d'autres options?

AVANT \ dir1 \ dir2 \ fichier.ext

AFTER \ dir1 \ dir2 \ fichier.ext fichier.zip


la source
Quelle version de Windows? Avez-vous Powershell? Préféreriez-vous utiliser Cscript / VBS (ou un autre - Jscript peut-être?)?
Dennis Williamson

Réponses:

2

Je suggère d'utiliser PowerShell.

Get-ChildItem -Include *.ext -Recurse
    | %{ &zipcommand a $_.FullName ($_.FullName+'.zip') }

Cela suppose que 'zipcommand' est votre outil zip en ligne de commande et qu'il nécessite 3 arguments, un 'pour' pour l'archive, le fichier à archiver et le nom de l'archive.

Céphas
la source
+1 pour utiliser Powershell. Je fais cela, mais utilisez plutôt 7-Zip. sauce extraordinnaire.
Pure.Krome
0

Ce n'est peut-être pas ce que vous cherchez, mais j'utiliserais Cygwin et l'utilitaire de recherche * nix:

find dir1 -name "*.ext" | while read i; do zip "$i.zip" "$i"; done

"find" commence à "dir1" et revient, en faisant correspondre tout avec un nom de la forme "* .ext". Il produit une liste de correspondances, dirigée vers "While read i", qui lit chaque ligne (un chemin correspondant) dans la variable "i". Pour chaque valeur différente de i, la commande "zip" est exécutée, comprimant le fichier dans une archive zip du même nom (et du même chemin), mais avec ".zip" ajouté.

Notez que ce qui précède ne supprimera pas le fichier original. J'aurais pu ajouter "rm $ i" après la commande zip pour le faire, mais il est préférable de créer les archives en une étape, puis d'utiliser:

find dir1 -name "*.ext" | while read i; rm "$i"; done

pour rechercher et supprimer les originaux. Une autre bonne chose à faire pour tester votre ligne avant de l'exécuter est de faire écho à la commande, plutôt que de l'exécuter.

find dir1 -name "*.ext" | while read i; do echo zip "$i.zip" "$i"; echo rm "$i"; done

Cela vous montrera chacune des commandes zip et rm que cela ferait si vous supprimiez les échos, afin que vous puissiez vous assurer que vous agissez correctement. Ensuite, supprimez les échos pour le faire réellement.

S'il existe un bon moyen de faire cela avec les utilitaires Windows courants, je ne le sais pas.

plongée
la source
0

Vous pouvez utiliser un script VBScript avec un programme zip en ligne de commande décent. Google pour VBScript + FileSystemObject + Recursive pour trouver un script vbscript approprié. Vous pouvez modifier le code pour exécuter l'outil zip de ligne de commande.

Salman A
la source
0

Voici un exemple dans Ch , qui intègre des fonctionnalités zip:

cd "c:\dir1\dir2"
pwd
string_t file, dir_listing=`ls ./`;
string_t zipfile;
foreach(file; dir_listing) {
    zipfile = strtok(file, "."); 
    zip $zipfile $file
    }
ls -l

Je l'ai écrit sur un système Windows, et cela devrait fonctionner sans aucun problème. Au moins c'est fait ici. Si vous voulez l'essayer, vous pouvez télécharger la version standard de Ch , qui est un freeware. Il suffit de coller le code dans un fichier texte et nommez - le tout .ch. Une fois que vous avez installé Ch, vous pouvez l'exécuter à partir de la ligne de commande.

Edit: Le script ci-dessus compressera tous les fichiers du répertoire spécifié. Pour filtrer les fichiers par extension, modifiez

string_t file, dir_listing=`ls ./`;

à

string_t file, dir_listing=`ls *.ext`;

Vous ne faites que modifier les arguments de la commande ls pour votre type de fichier.

Joe Internet
la source