2017-07-21 1 views
0

Alors, je entre parenthèses dans le nom du dossier avec des espaces:Nom du dossier avec Parenthèses dans la variable bash

dossier dossier \ (2000) \ file.srt

dossier dossier \ (1990) \ file.srt

for file in `find . -name "*.srt"` 
do 
echo "file = $file"; 
done 

Ne fonctionne pas dans mon script. Est-ce que quelqu'un peut m'aider?

+0

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

Répondre

0

Vous pouvez utiliser find -exec pour cela:

find . -name "*.srt" -exec echo "file = {}" \; 

Sortie:

file = ./folder/folder (1990)/file.srt 
file = ./folder/folder (2000)/file.srt 
+0

Ne fonctionne pas ici, besoin en boucle. J'ai utilisé l'écho à titre d'exemple. Mon script utilise l'iconv. Merci pour maintenant. – LetterLin

+0

[Look Here] (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

+0

@LetterLin Je pense que le problème est en fait les espaces. Essayez ceci: 'files = $ (find. -name '* .srt')' 'while read f; fais écho "fichier: $ f"; fait <<< $ files' – Tom

0

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.