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?

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.


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.


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

¡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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.