Estoy tratando de entender cómo usar la opción find -maxdepth 0.

Tengo la siguiente estructura de directorios.

--> file1 --> parent --> child1 --> file1 --> file2 --> child2 --> file1 --> file2 --> file1 

Ahora, ejecuto mi comando find como se muestra a continuación.

find ./parent -maxdepth 0 -name "file1" find ./ -maxdepth 0 -name "file1" find . -maxdepth 0 -name "file1" 

Sin ninguno de los find comandos anteriores, file1 se devuelve.

Desde la página de manual de find, veo la siguiente información.

-maxdepth 0 significa que solo aplica las pruebas y acciones a los argumentos de la línea de comando.

Busqué algunos ejemplos con la opción -maxdepth 0 y no pude encontrar ningún ejemplo adecuado.

Mi find versión es,

find --version find (GNU findutils) 4.4.2 

¿Alguien puede proporcionarme algunos consejos sobre los casos en que la opción -maxdepth 0 sería útil ?

EDIT

Cuando ejecuto el siguiente comando, obtengo el file1 aparece en la lista dos veces. ¿Está previsto que funcione de esta manera?

find . file1 -maxdepth 1 -name "file1" ./file1 file1 

Respuesta

Supongamos que tenemos file1 en el directorio actual. Luego :

$ find . -maxdepth 0 -name "file1" $ find . file1 -maxdepth 0 -name "file1" file1 

Ahora, veamos lo que dice la documentación:

-maxdepth 0 significa onl y aplicar las pruebas y acciones a los argumentos de la línea de comandos.

En mi primer ejemplo anterior, solo el directorio . aparece en la línea de comando. Dado que . no tiene el nombre file1, no aparece nada en la salida. En mi segundo ejemplo anterior, tanto . como file1 se enumeran en la línea de comandos y, porque file1 coincide con -name "file1", se devolvió en la salida

En otras palabras, -maxdepth 0 significa hacer no buscar directorios o subdirectorios. En su lugar, busque solo un archivo coincidente entre los que se enumeran explícitamente en la línea de comando.

En sus ejemplos, solo los directorios se enumeraron en la línea de comando y ninguno de ellos se denominó file1. Por lo tanto, no hay salida.

En general, se pueden nombrar muchos archivos y directorios en la línea de comandos. Por ejemplo, aquí probamos un comando find con 11 archivos y directorios en la línea de comando:

$ ls d1 file1 file10 file2 file3 file4 file5 file6 file7 file8 file9 $ find d1 file1 file10 file2 file3 file4 file5 file6 file7 file8 file9 -maxdepth 0 -name "file1" file1 

superposición rutas

Considere:

$ find . file1 -maxdepth 0 -iname file1 file1 $ find . file1 file1 -maxdepth 0 -iname file1 file1 file1 $ find . file1 file1 -maxdepth 1 -iname file1 ./file1 file1 file1 

Aparentemente, como señala Ramesh, find seguirá cada ruta especificada en la línea de comando y busque coincidencias incluso si las rutas conducen al mismo archivo, como en . file o incluso si las rutas son duplicados exactos, como en file1 file1.

Comentarios

  • gracias. Pero, ¿cómo podría pasar algunos nombres de archivos en la línea de comandos?
  • Buen punto. Vea mi respuesta actualizada. Puede poner tantos como desee antes de la primera prueba. Por ejemplo: find * -maxdepth 0 -name "file1". El * enumerará todos los archivos en el directorio actual en la línea de comando.
  • @Ramesh Respuesta actualizada nuevamente con, espero, una mejor explicación y ejemplos.
  • gracias de nuevo. Actualicé mi pregunta con más detalles de su última actualización.
  • @Ramesh No puedo encontrarlo documentado, pero veo el mismo comportamiento que usted: find mira cada uno ruta en la línea de comando y los informes coinciden en cada uno, incluso si son duplicados.

Responde

Si desea buscar archivos de forma no recursiva (no directorios) dentro de un directorio use:

 find . -maxdepth 1 -type f -name "file1" # ./file1  

-maxdepth 0 no buscará . Solo intentará hacer coincidir los nombres de archivos / directorios que proporcionó como argumentos en find. P.ej. en la declaración anterior, usando un valor 0, intentaría hacer coincidir file1 con . que no coincide. Pasar * en lugar de . haría que bash reemplazara * con la lista de archivos en el directorio actual que devolvería una coincidencia.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *