Encontrar subdirectorios dentro de todos los directorios con el mismo nombre

8

Quiero ejecutar un comando para:

  1. Encuentre todos los directorios llamados " inc" debajo de una carpeta " X".
  2. Enumere todos los subdirectorios debajo de cada " X/.../inc/".
  3. Redireccionar la salida a un archivo llamado " list"

Intenté varias combinaciones del siguiente comando, sin éxito:

$ find X/ -name "inc" -print | xargs find {} -type d > list
find: path must precede expression

¿Cómo puedo hacer esto?

iammilind
fuente

Respuestas:

13

find puede hacer todo esto solo:

find X -path '*/inc/*' -type d > list

Lea la -pathparte de man findpara más información.

Como mencioné rápidamente en un comentario: si almacena la línea de directorios separada en un archivo de texto, los nombres de directorio que contienen líneas nuevas no serán claramente representables. Si está seguro de que los directorios no contienen nuevas líneas, está bien. Solo un comentario general.

Daniel Andersson
fuente
sí. Di la misma respuesta aquí
Príncipe John Wesley
O encuentre X -name 'inc' -type d> list
MaQleod
@MaQleod: No, esa no es la pregunta.
Daniel Andersson
4

Aquí hay un práctico one-liner:

find X -type d -name "inc" -exec sh -c 'find {} -type d' \; > list

Se ejecuta finden cada uno de los primeros findresultados. La execopción también puede tomar un comando de shell mínimo, en el que, como dije, {}se reemplaza con cada directorio del primero find.

El segundo find, según su solicitud, "enumerará todos los subdirectorios" de los primeros resultados, incluido el incdirectorio. Si no quiere eso en la salida, deje que la segunda find al menos envíe carpetas de profundidad 1.

find X -type d -name "inc" -exec sh -c 'find {} -mindepth 1 -type d' \; > list

Luego simplemente redirigiremos los comandos stdouta list.

slhck
fuente
una variación de esa respuesta fue útil para mí donde solo quería subdirectorios de profundidad 1 de la coincidencia original find path -name inc -type d -exec sh -c 'find {} -mindepth 1 -maxdepth 1 -type d' \;
Core
1

Bien, he encontrado la respuesta para simular este hallazgo anidado:

find X/ -type d | grep "/inc/" > list
iammilind
fuente
¡Bien, eso también funcionará! Sin embargo, en shells de Unix / Linux, realmente no hay tal cosa como la respuesta. Es una mezcla de preferencias personales y lo que es fácil de seguir.
Vishal Kotcherlakota
Para ocuparse de nombres de archivo no convencionales (pero existentes) con, por ejemplo, nuevas líneas: find X/ -type d -print0 | awk 'BEGIN{RS="\0"}/\/inc\//' > list( grep -ztambién delimita el carácter nulo, pero su salida parece estar también separada por nulo, por lo que sería necesario canalizarla, por ejemplo, xargs -0L1 echopara obtener línea por línea ) En este caso, dado que está guardando la lista en un archivo con cada entrada separada por una nueva línea, las nuevas líneas en los nombres de archivo seguirán estando representadas de manera ambigua. Quizás ni siquiera necesite el archivo intermedio, según lo que desee hacer con la lista.
Daniel Andersson
1

Prueba esto:

   find path-of-x -path '*/inc/*' -type d > list
Príncipe John Wesley
fuente
No tengo una máquina Linux para probarlo ahora ...
Prince John Wesley
Esto no funciona Pero gracias por "\inc\"
sugerirme
@iammilind: prueba con la -pathbandera
Prince John Wesley