Passer plusieurs fichiers avec des espaces dans un script python

0

Je dois convertir beaucoup de fichiers .ai en .svg, et j'ai trouvé l'outil ai2svg. J'ai essayé

for i in `find ./ -type f -name \*.ai`; do python ai2svg.py "$i"; done

Mais je reçois des erreurs comme

IOError: [Errno 2] Aucun fichier ou répertoire de ce type: Traceback "Profil" (appel le plus récent en dernier): fichier "ai2svg.py", ligne 171, dans inf = open (sys.argv [1])

Lorsque le nom du fichier est "Profile test.ai". Y a-t-il un moyen de le contourner, sauf de supprimer au préalable tous les espaces dans les noms des fichiers .ai?

Je vous remercie.

Misiur
la source

Réponses:

1

Cela va le faire:

find . -type f -name \*.ai -exec python ai2svg.py {} \;

Si ai2svg.pyfonctionne avec plusieurs fichiers (comme la plupart des outils * nix), vous pouvez le faire pour exécuter la commande le nombre minimum de fois:

find . -type f -name \*.ai -exec python ai2svg.py {} +

Si vous ne vous souciez que des fichiers du répertoire en cours, vous pouvez utiliser la boucle standard pour cela:

for file in *.ai
do
    python ai2svg.py "$file"
done
l0b0
la source
J'ai découvert "trouvez ./ -type f -name * .ai -print0 | while IFS = read -r -d '' file; faites python ai2svg.py" $ file "; done" aussi ". Est-il vrai que les boucles avec find sont une mauvaise pratique?
Misiur
0

La bonne façon de le faire est la suivante:

find . -maxdepth 1 -type f -name '*.ai' -print0 | while read -d '' -r file; do python ai2svg.py "$file"; done

Remarquez que l’ -print0option findassociée à -d ''in readprend en charge tous les caractères d’espacement des noms de fichiers, y compris les sauts de ligne et les tabulations.

Jimmij
la source
Ce n'est pas compatible POSIX, et utiliser le séparateur NUL n'est nécessaire que si vous voulez faire quelque chose de plus compliqué que -execle nom de fichier.
l0b0