Estoy ejecutando Mac 10.7.5. En una terminal, usaré este comando para encontrar archivos con cadenas
find src/main -name "*" | xargs grep -i 'mystring'
Sin embargo, cuando los archivos contienen espacios, obtendré resultados como
grep: images/mystuff/essential-questions-selected-arrow-ela: No such file or directory
grep: 5.24.38: No such file or directory
grep: PM.png: No such file or directory
El archivo real en el ejemplo anterior es "essential-questions-selected-arrow-ela 5.24.38 PM.png" ¿Cómo ejecuto el comando anterior correctamente, incluso si los archivos que se buscan contienen espacios?
find
yxargs
incluido en el soporte OS X la-print0
y-0
opciones, respectivamente.De lejos, la forma más segura y fácil de hacer este tipo de cosas es usar find's
-exec
opción. Desdeman find
:En otras palabras, la
-exec
La opción ejecutará lo que le des en los resultados de buscar, reemplazando{}
con cada archivo (o directorio) encontrado. Entonces, para grep para una cadena en particular, harías:Eso, sin embargo, también encontrará directorios y dará un error. Funcionará, fíjate, solo se quejará cuando intentes ejecutarlo en un directorio, habrías tenido el mismo problema usando
xargs
. Lo que realmente intentas hacer aquí es encontrar todos los archivos y solo los archivos. En ese caso, el-name '*'
no es necesario ya quefind src/main
es exactamente lo mismo quefind src/main -name "*"
. Entonces, en lugar de usar eso, especifique que solo desea buscar archivos:fuente
;
o+
. De lo contrario serían consumidos por la cáscara, nofind
.+
, no tiene un significado especial para el shell, que es una de las razones por las que usé eso en lugar de;
.