Je veux diriger les noms de fichiers vers d'autres programmes, mais ils s'étouffent tous lorsque les noms contiennent des espaces.
Disons que j'ai un fichier appelé.
foo bar
Comment puis-je obtenir find
le nom correct?
Evidemment je veux:
foo\ bar
ou:
"foo bar"
EDIT : Je ne veux pas passer par xargs
, je veux obtenir une chaîne correctement formatée find
afin que je puisse diriger la chaîne de noms de fichiers directement vers un autre programme.
find
formate très bien les noms de fichiers; ils sont écrits un nom par ligne. (Bien sûr, cela est ambigu si un nom de fichier contient un caractère de nouvelle ligne.) Le problème est donc que l'extrémité de réception "s'étouffe" lorsqu'elle obtient un espace, ce qui signifie que vous devez nous dire quelle est l'extrémité de réception si vous voulez une réponse significative. .
find
de proposer (par exemple) une option pour sortir les noms de fichiers dans un format adapté au shell. En général, cependant, l' extension -print0
GNU find
fonctionne bien pour de nombreux autres scénarios (aussi), et vous devez apprendre à l'utiliser dans tous les cas.
ls $(command...)
ne fait pas passer la liste stdin
. Il place la sortie de $(command...)
directement dans la ligne de commande. Dans ce cas, c'est le shell qui lit à partir du c, et il utilisera la valeur actuelle de $IFS
pour décider comment séparer les mots en sortie. En général, il vaut mieux utiliser xargs
. Vous ne remarquerez pas un coup de performance.
find -printf '"%p"\n'
ajoutera des guillemets doubles autour de chaque nom trouvé, mais ne citera pas correctement les guillemets doubles dans un nom de fichier. Si vos noms de fichiers n'ont pas de guillemets doubles incorporés, vous pouvez ignorer le problème: ou passer par sed 's/"/&&/g;s/^""/"/;s/""$/"/'
. Si vos noms de fichiers finissent par être traités par le shell, vous devriez probablement utiliser des guillemets simples au lieu de guillemets doubles (sinon sweet$HOME
cela deviendra quelque chose comme sheet/home/you
). Et ce n'est toujours pas très robuste contre les noms de fichiers avec des retours à la ligne. Comment voulez-vous gérer cela?
-exec
drapeau avecfind
? vous pourriez potentiellement atténuer cette erreur et rendre votre commande plus efficace en la faisant-exec
au lieu de la rediriger vers d'autres commandes. Just my $ .02