Con este conjunto de comandos, ¿cuáles son los {} y \; personajes para?Comando simple de Unix, ¿cuál es el {} y ; para
find . -name '*.clj' -exec grep -r resources {} \;
Con este conjunto de comandos, ¿cuáles son los {} y \; personajes para?Comando simple de Unix, ¿cuál es el {} y ; para
find . -name '*.clj' -exec grep -r resources {} \;
Ver man find. (En particular la parte de -exec
)
Al utilizar -exec
para ejecutar un comando en cada uno de los archivos encontrados, el {}
se reemplaza con el nombre de cada archivo encontrado, y el comando es terminado por \;
En su Por ejemplo, todos los archivos encontrados en el directorio actual (.
), que coincida con el nombre *.clj
, tendrán el comando grep -r resources
ejecutándose en ellos (para encontrar la cadena resources
si existe en cada uno de esos archivos).
En realidad es algo redundante, ya que -r
es para buscar recursivamente subdirectorios, y eso es lo que find
ya está haciendo.
En find, el parámetro -exec toma el resto de los parámetros hasta el; (punto y coma) que tiene que ser escapado, de ahí el \ ;. Dentro de este lapso, {} se reemplaza con el nombre del archivo que se inspecciona.
La cadena de caracteres "{}" se reemplazará por el archivo actual que se está procesando. El punto y coma escapado termina el argumento del comando para la opción -exec.
consideran este comando alternativo que me parece más fácil de entender:
find . -name *.clj | xargs grep -r resources
Pero que tiene el mayor defecto de manejo incorrecto de archivos con espacios integrados y similares. – jlliagre
La cadena {}
en find
se sustituye por el nombre de ruta del archivo actual.
El punto y coma se utiliza para terminar el comando de shell invocado por la utilidad find
.
Necesita ser escapado, o citado, por lo que no será interpretado por el shell, porque ;
es uno de los caracteres especiales utilizados por shell (operadores de lista).
Consulte también: Why are the backslash and semicolon required with the find command's -exec option?
Tenga en cuenta que no es necesario "-r grep" a menos que los archivos son .clj carpetas. find es por defecto recursivo, por lo que grep no tiene que ser así. (grep se alimentará con cada archivo.) En su lugar, puede usar xargs, ya que con su comando actual no sabrá de qué archivos obtiene los hits. – PEZ