J'ai un directory qui a 800 files comme celui-ci:
file1.png [email protected] file2.png [email protected] file3.png [email protected] ... etc
J'ai besoin de créer des files zip comme celui-ci
file1.zip (containing file1.png and [email protected]) file2.zip (containing file2.png and [email protected]) file3.zip (containing file3.png and [email protected])
Y a-t-il une command magique que je peux utiliser pour faire cela?
Si toujours il y en a deux , c'est simple:
for f in file+([0-9]).png; do zip "${f%png}zip" "$f" "${f/./@2x.}"; done
Notez que ce qui précède fonctionnera tel quel à partir de la command line. Si vous avez l'intention de l'utiliser dans un script, mettez shopt -s extglob
quelque part avant cette ligne. ( extglob
est activé par défaut uniquement dans les shells interactifs.)
Dans le vieux bash
ne pas gérer les templates étendus cette solution de travail laide va fonctionner, mais il vaut mieux changer la logique comme suggéré dans une autre réponse par Leonid:
for f in file[0-9].png file*[0-9][0-9].png; do zip "${f%png}zip" "$f" "${f/./@2x.}"; done
Que diriez-vous d'une version légèrement modifiée de ce qui a été suggéré par manatwork? Quelque chose comme ça: for f in file*@2x.png; do zip ${f%@2x.png}.zip $f ${f/@2x./.}; done
for f in file*@2x.png; do zip ${f%@2x.png}.zip $f ${f/@2x./.}; done
Il itère sur les files «seconde paire» seulement, et il n'y a pas d'expression rationnelle dans la génération de la list des files.