Le jour est venu où j'ai dû écrire un BASH script qui parcourt des arbres de répertoires arbitraires et regarde des fichiers arbitraires et tente de déterminer quelque chose concernant une comparaison entre eux. Je pensais qu'il s'agirait d'un simple travail de quelques heures des sommets ! Le processus - pas vraiment !
Mon problème est que parfois, des idiots -ahem!- m'excusent, Très bon utilisateur choisit de mettre des espaces dans les noms de répertoires et de fichiers. Cela fait échouer mon script.
La solution idéale En dehors de la menace de la guillotine pour ceux qui insistent sur l'utilisation d'espaces à ces endroits (sans parler des gars qui mettent cela dans le code des systèmes d'exploitation ! Y a-t-il quelque chose de ce genre dans une distribution Unix/Linux standard ?
Notez que le simple for file in *
ne fonctionne pas si bien lorsqu'on essaie de comparer des arbres de répertoires, car elle ne permet pas d'établir des comparaisons. UNIQUEMENT fonctionne sur "le répertoire courant" - et, dans ce cas comme dans beaucoup d'autres, le fait de passer constamment d'un CD à un autre répertoire pose ses propres problèmes. En faisant mes devoirs, j'ai donc trouvé cette question Gérer les caractères spéciaux dans la boucle for...in de bash et la solution proposée ici s'accroche aux espaces dans les noms de répertoires, mais peut simplement être contournée comme ceci :
dir="dirname with spaces"
ls -1 "$dir" | while read x; do
echo $x
done
VEUILLEZ NOTER : Le code ci-dessus n'est pas particulièrement merveilleux car les variables utilisées à l'intérieur de la boucle while sont INACCESSIBLES en dehors de cette boucle while. Cela est dû au fait qu'un sous-shell implicite est créé lorsque la sortie de la commande ls est acheminée. C'est un facteur de motivation essentiel pour ma requête !
...OK, le code ci-dessus est utile dans de nombreuses situations, mais "l'échappement" des caractères serait également très efficace. Par exemple, le code ci-dessus pourrait contenir :
dir\ with\ spaces
Est-ce que cela existe déjà et que je l'ai juste négligé ?
Si non, quelqu'un a-t-il une proposition facile pour en écrire une - peut-être avec sed ou lex ? (Je suis loin d'être compétent avec l'un ou l'autre).