Le problème est que les espaces dans les noms de fichiers produits par find(1)
OBTIENNENT intercalées dans les noms séparés par \n
s, et la commande for
les obtient tous sans les différencier.
La meilleure approche (et qui enregistre les commandes) consiste à utiliser find(1)
avec l'option -print0
, qui imprime les noms de fichiers séparés par un caractère nul, puis utiliser la commande xargs
avec l'option -0
, qui attend nulls comme séparateurs. De cette façon, vous pouvez exécuter une commande avec autant de paramètres que le système peut se permettre. Par exemple,
find . -type f -name "* *" -print0 | xargs -0 cat
affichera le contenu de tous les fichiers contenant un espace dans leur nom. Dans votre exemple, vous voulez faire des scripts avec chaque ligne de données, donc une meilleure approche sera d'utiliser la commande shell read
, comme dans (dans ce cas, vous n'avez pas besoin de l'option -print0
, car la commande les fichiers sont délimités par des sauts de ligne, de sorte que vous allez lire un fichier par lecture)
find . -name "*.srt" | while read file
do
echo "file = ${file}"
done
mais dans ce cas, vous ne serez pas obtenir l'utilisation xargs(1)
efficace, en mettant autant de paramètres dans la ligne de commande de la commande appelé possible. Vous allez traiter chaque fichier un fichier à la fois.
Ne travaille pas pour moi. [Regarder ici] (https://gist.github.com/oe1tkt/e9182b32382f78a41c1a) J'utilise ce script, mais dans ma structure ne fonctionne pas, car this() dans le nom du dossier. – LetterLin