Estoy tratando de obtener una lista de directorios que están contenidos dentro de una carpeta específica.
Dados estos ejemplos de carpetas:
foo/bar/test
foo/bar/test/css
foo/bar/wp-content/plugins/XYZ
foo/bar/wp-content/plugins/XYZ/js
foo/bar/wp-content/plugins/XYZ/css
baz/wp-content/plugins/ABC
baz/wp-content/plugins/ABC/inc
baz/wp-content/plugins/ABC/inc/lib
baz/wp-content/plugins/DEF
bat/bar/foo/blog/wp-content/plugins/GHI
Me gustaría un comando que regrese:
XYZ
ABC
DEF
GHI
Básicamente, estoy buscando las carpetas que están dentro de wp-content / plugins /
El uso find
me ha acercado más, pero no puedo usarlo -maxdepth
porque la carpeta está muy lejos de donde estoy buscando.
La ejecución de lo siguiente devuelve todos los directorios secundarios, de forma recursiva.
find -type d -path *wp-content/plugins/*
foo/bar/wp-content/plugins/XYZ
foo/bar/wp-content/plugins/XYZ/js
foo/bar/wp-content/plugins/XYZ/css
baz/wp-content/plugins/ABC
baz/wp-content/plugins/ABC/inc
baz/wp-content/plugins/ABC/inc/lib
baz/wp-content/plugins/DEF
bat/bar/foo/blog/wp-content/plugins/GHI
?
. Para bash, (como se etiqueta en la pregunta) esto funciona .find
implementaciones que generan un?
carácter de reemplazo o cualquier tipo de escape o cualquier forma de escape para caracteres no imprimibles solo lo hacen cuando la salida va a una terminal, no cuando va a una tubería como aquí.sed
/awk
que todos los archivos están en una línea. Ahora, uno puede argumentar que obtener unaABC?BCD
oABC\nBCD
para una salida interactiva / terminal sería más útil que obtener dosABC
yBCD
líneas para un directorio llamado$'ABC\nBCD
. Eso está al nivel de la presentación del usuario, también podríamos señalar que para un archivo llamado$'AB\bC'
, cuando la salida va a una terminal,AC
?
Básicamente:
huellas dactilares:
o
huellas dactilares:
fuente
Podría tener
find
recurrencia, más o menos:fuente
Para Bash: Simple (funciona para archivos / directorios con espacios y líneas nuevas ):
Imprimir:
Incluso si hay archivos creados.
fuente
dotglob
de directorios ocultos, omite archivos ocultos (vea la opción si no es deseado) e incluye enlaces simbólicos a directorios además de directorios (**
también atravesaría enlaces simbólicos en bash 4.2 y versiones anteriores).find
no excluye ningún archivo. Globs excluye los archivos de puntos, vale la pena señalar como una diferencia entre los dos.El
tree
comando está diseñado exactamente para este propósito. La profundidad se puede controlar con la-L
bandera. Aquí hay un ejemplo en un sitio local de Wordpress que mantengo:fuente
Sobre la base de la respuesta de DopeGhoti, ¿qué tal el ciclo de coincidencia:
La razón para hacerlo de esta manera es que puede resultar confuso / engorroso con múltiples
-exec
's, al tiempo que evita problemas con nombres de archivo peculiares que contienen \ n' ', etc. -print0 usará separadores nulos entre los resultados.fuente
Sobre la base de lo que empezaste:
egrep toma * wp-content / plugins / * y cualquier carácter hasta la siguiente barra diagonal o final de línea $, que incluye la parte que desea.
sed , con un delimitador ~, selecciona la parte que desea utilizando el primer conjunto de paréntesis () y utiliza \ 1 (lo que desea) como reemplazo de todo
uniq filtra resultados duplicados
fuente