Quiero ejecutar un comando para:
- Encuentre todos los directorios llamados "
inc
" debajo de una carpeta "X
". - Enumere todos los subdirectorios debajo de cada "
X/.../inc/
". - 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?
linux
command-line
find
iammilind
fuente
fuente
Aquí hay un práctico one-liner:
Se ejecuta
find
en cada uno de los primerosfind
resultados. Laexec
opción también puede tomar un comando de shell mínimo, en el que, como dije,{}
se reemplaza con cada directorio del primerofind
.El segundo
find
, según su solicitud, "enumerará todos los subdirectorios" de los primeros resultados, incluido elinc
directorio. Si no quiere eso en la salida, deje que la segundafind
al menos envíe carpetas de profundidad 1.Luego simplemente redirigiremos los comandos
stdout
alist
.fuente
find path -name inc -type d -exec sh -c 'find {} -mindepth 1 -maxdepth 1 -type d' \;
Bien, he encontrado la respuesta para simular este hallazgo anidado:
fuente
find X/ -type d -print0 | awk 'BEGIN{RS="\0"}/\/inc\//' > list
(grep -z
tambié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 echo
para 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.Prueba esto:
fuente
"\inc\"
-path
bandera