Quiero canalizar nombres de archivos a otros programas, pero todos se ahogan cuando los nombres contienen espacios.
Digamos que tengo un archivo llamado.
foo bar
¿Cómo puedo obtener find
el nombre correcto?
Obviamente quiero:
foo\ bar
o:
"foo bar"
EDITAR : No quiero pasar xargs
, quiero obtener una cadena con el formato correcto find
para poder canalizar la cadena de nombres de archivo directamente a otro programa.
find
formatea bien los nombres de archivo; están escritos un nombre por línea. (Por supuesto, esto es ambiguo si un nombre de archivo contiene un carácter de nueva línea). Entonces, el problema es que el extremo receptor se "ahoga" cuando obtiene un espacio, lo que significa que debe decirnos cuál es el extremo receptor si desea una respuesta significativa. .
find
ofrecer una opción para generar nombres de archivo en un formato adecuado para el shell. En general, sin embargo, la extensión -print0
GNU find
funciona bien para muchos otros escenarios (también), y debe aprender a usarla en cualquier caso.
ls $(command...)
no alimenta la lista stdin
. Pone la salida de $(command...)
directamente en la línea de comando. En ese caso, es el shell el que está leyendo la c, y usará el valor actual de $IFS
para decidir cómo dividir las palabras en la salida. En general, es mejor usarlo xargs
. No notará un golpe de rendimiento.
find -printf '"%p"\n'
agregará comillas dobles alrededor de cada nombre encontrado, pero no citará correctamente las comillas dobles en un nombre de archivo. Si los nombres de sus archivos no tienen comillas dobles incrustadas, puede ignorar el problema: o pasarlo sed 's/"/&&/g;s/^""/"/;s/""$/"/'
. Si sus nombres de archivo terminan siendo manejados por el shell, probablemente debería usar comillas simples en lugar de comillas dobles (de lo contrario, sweet$HOME
se convertirá en algo así sheet/home/you
). Y esto todavía no es muy robusto contra los nombres de archivo con nuevas líneas en ellos. ¿Cómo quieres manejar eso?
-exec
bandera confind
? potencialmente podría aliviar este error y hacer que su comando sea más eficiente al hacerlo en-exec
lugar de canalizarlo a otros comandos. Just my $ .02