Algo como lo siguiente es lo que busco, pero mi código no funciona, no importa cómo escapo {}
y+
;
find ./ -maxdepth 1 -type d -name '.*' -exec \
find {} -maxdepth 1 -type f -name '*.ini' -exec \
md5sum \{\} \\; \;
Después de ver esta pregunta de Unix - y - Linux , descubrí que el siguiente código funciona, pero no anida encontrar como tal, y sospecho que hay una mejor manera de hacer este trabajo en particular.
find ./ -maxdepth 1 -type d -name '.*' \
-exec bash -c 'for x; do
find "$x" -maxdepth 1 -type f -name "*.ini" \
-exec md5sum \{\} \;; \
done' _ {} \+
¿Hay alguna forma de anidar find -exec
sin la necesidad de invocar un caparazón (como se indicó anteriormente), con todas sus extrañas citas y restricciones de escape?
¿O puede hacerse esto directamente en un solo comando de búsqueda, usando una combinación de sus muchos parámetros?
text-processing
find
filenames
Peter.O
fuente
fuente
find
, pero sifind
no puede hacerlo, ¿find
por qué es tan venerado (?) Como la herramienta? para usar para encontrar archivos? ... He descubierto quefind ./ -maxdepth 2 -path '.*/*.ini' -type f -exec md5sum {} \+
funciona bien en mi situación (la referencia de jw013-prune
me llevó a esto en la página del manual), pero me pregunto si es un método robusto (en géneros). Realmente nunca he usadofind
(en menos de un año de Linux), ya quelocate
he hecho casi todo lo que necesito, por lo que es un territorio desconocido.-path
prueba es exactamente lo que iba a sugerir. Con esto, deberías poder hacer todo lo que quieras (perdón por la asociación Ace Of Base;))Respuestas:
Intentaría usar un solo hallazgo como:
o incluso (no,
find
en absoluto, solo con globos)aunque esto carece de
-type f
verificación, por lo que solo funciona si no tiene directorios / no archivos que terminan en.ini
. Si lo haces, podrías usarlo que, sin embargo, perdería la ventaja de necesitar solo una invocación de md5sum.
Editar
Para un método de encadenamiento general y seguro
find
, puede hacer algo comofuente
-f
(f?), Y luego otro error con-execdir
... Cuando reemplazo -execdir con -exec, y / o también reemplazo md5sum con print, no obtengo nada ...find
... No es tanto que solo quiera que se resuelva este ejemplo, estoy buscando ideas sobre las formas de find-fu ... Tal vez haya más pelusa que fu en encontrar ... (No lo sé, porque prácticamente nunca lo he usado), y esta es la primera situación que realmente quería usar (para archivos de imagen en realidad) y el -exec de la que he oído hablar tanto parece no ser tan poderoso como su representante (?) alude a ... (+1 para las alternativas, sin embargo) ... pero sufind
ejemplo simplemente no funciona (aún )find
comando: ...find: The relative path
~ / bin 'está incluido en la variable de entorno PATH, que es insegura en combinación con la acción -execdir de find. Por favor, elimine esa entrada de $ PATH` .... Así que tal vez funcione, pero debo decir que he estado tratando de deshacerme de ese ~ / bin por un tiempo ahora ... Tendré que tomar más Míralo seriamente ... No sé dónde lo he puesto ... alguna idea de dónde puede estar al acecho; el~/bin
en mi RUTAfind
se aprecia mejor en situaciones que no se pueden hacer completamente con globos, pero como ese tipo de situaciones son raras, normalmente no necesito encontrar mucho.Su problema original no requiere llamar a find recursivamente, pero supongo que ese no era el punto.
Creo que no es posible llamar a find de forma recursiva de la manera que desee.
Lo siguiente no es llamar a find recursivamente (o anidar, como se llame) tampoco, pero ¿no puede simplemente tomar un conjunto de resultados del primer find y alimentarlo al segundo? Así es como lo haría instintivamente:
También puede usar
xargs
para ejecutar el segundo hallazgo.Actualizar:
Quería agregar eso porque la mayoría de las utilidades de UNIX toman varios argumentos de nombre de archivo en lugar de uno, por lo general, puede evitar por
-exec
completo:Al anidar backticks solo agrega barras invertidas
\
antes que las internas.Si imaginamos que
md5sum
solo toma un argumento de nombre de archivo, siempre podemos envolverlo en unfor
bucle:Tenga en cuenta que esto se vuelve más difícil si
-
están involucrados los nombres de archivo / directorio que comienzan con o que contienen un espacio. Las utilidades de UNIX no funcionan bien con ellas. En ese caso, la adición de./
,--
o se necesita comillas.Obviamente, el ejemplo original no es bueno, porque podríamos hacer:
fuente
find
métodos mostrados reciben un error cuando un archivo / directorio contiene espacios ...md5sum .*/*.ini
Funciona bien ... Estoy empezando a tener la sensación general de que * Warren Young * comentar sobre cosas que se vuelven 'complejas' para quefind
ocurran al principio del juego :), pero supongo que sefind
hace realidad cuando las pruebas de condición son más complejas, pero en lo que respecta a anidar -exec, he descartado la idea, ya que parece que hay formas más sencillas de hacerlo ... (pero perl no es "simple" para mí (todavía) ...Al menos logré anidar 2 comandos de búsqueda:
Pero no resolví invocar otro -exec (dir) - llamar desde allí.
fuente