Estou tentando obter uma lista de diretórios contidos em uma pasta específica.
Dados esses exemplos de pastas:
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
Eu gostaria de um comando que retorne:
XYZ
ABC
DEF
GHI
Basicamente, estou procurando as pastas que estão dentro do wp-content / plugins /
O uso find
me aproximou mais, mas não posso usá-lo -maxdepth
, porque a pasta está longe de onde estou pesquisando.
A execução do seguinte retorna todos os diretórios filhos, recursivamente.
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 o bash, (conforme marcado na pergunta), isso funciona .find
implementações que produzem um?
ou qualquer caractere de substituição ou qualquer forma de escape para caracteres não imprimíveis só fazem isso quando a saída vai para um terminal, não para um tubo como aqui.sed
/awk
que todos os arquivos estão em uma linha. Agora, alguém pode argumentar que obter uma saída /ABC?BCD
ouABC\nBCD
interativa / terminal seria mais útil do que obter duas linhasABC
eBCD
um dir chamado$'ABC\nBCD
. Que está no nível de apresentação do usuário, também poderíamos apontar que por um arquivo chamado$'AB\bC'
, quando a saída vai para um terminal, você veriaAC
sem tal?
substituição ...Basicamente:
impressões:
ou
impressões:
fonte
Você poderia
find
recursar, mais ou menos:fonte
Para Bash: Simples (funciona para arquivos / diretórios com espaços e novas linhas ):
Imprimirá:
Mesmo se houver arquivos criados.
fonte
dotglob
opção se isso não for desejado) e inclui links simbólicos para diretórios além de diretórios (**
também atravessaria links simbólicos no bash 4.2 e versões anteriores).find
não exclui nenhum arquivo. globs exclui arquivos de ponto, vale a pena apontar como uma diferença entre os dois.O
tree
comando foi projetado exatamente para esse fim. A profundidade pode ser controlada com a-L
bandeira. Aqui está um exemplo em um site Wordpress local que eu mantenho:fonte
Com base na resposta de DopeGhoti, que tal loop de correspondência:
A razão para fazê-lo dessa maneira é que você pode achar confuso / complicado com múltiplos
-exec
's, enquanto ainda evita problemas com nomes de arquivos peculiares que contêm \ n' ', etc. -print0 usará separadores nulos entre os resultados.fonte
Com base no que você começou:
egrep pega * wp-content / plugins / * e qualquer caractere até a próxima barra / ou final da linha $ - que inclui a parte que você deseja.
sed , com um delimitador ~, seleciona a parte que você deseja usando o primeiro conjunto de parênteses () e usa \ 1 (o que você deseja) como substituto de tudo
O uniq filtra resultados duplicados
fonte