lista todos os diretórios contendo arquivos * .html e também lista os arquivos nos diretórios

1

Eu gostaria de obter a lista de todos os diretórios que contém documentos HTML, concluímos .htm ou .html ignorando maiúsculas ou minúsculas.

Eu tentei:

find / -type d -ls | tr -s [:blank:] | cut -d ' ' -f 11 | grep -i -e "*.htm" -e "*.html"

Mas apenas lista diretórios, e eu preciso listar o conteúdo desses diretórios e não sei como.

Eu tentei:

find / -type d -exec ls -l {} \; | tr -s [:blank:] | cut -d ' ' -f 9 | grep -i -e ".htm" -e ".html"

E ele os encontra, mas como eu imprimo os diretórios onde eles estão?.

    
por enoy 29.10.2016 / 13:58

2 respostas

0

Sugiro usar

find / '(' -iname '*.htm' -o -iname '*.html' ')' -printf '%h\n' | uniq | xargs -r -d '\n' ls -l

A primeira parte, find / '(' -iname '*.htm' -o -iname '*.html' ')' -printf '%h\n' , localiza todos os arquivos que terminam com .htm ou .html em maiúsculas ou minúsculas (usando padrões glob) e imprime o diretório ( %h ) para cada arquivo encontrado, um diretório por linha.

Por causa de como find varre os diretórios, há um ou mais diretórios idênticos consecutivos listados; uniq retém apenas um de cada.

Finalmente, alimentamos a lista de diretórios para xargs , informando para não executar um comando sem nenhum diretório -r e que o separador é uma nova linha -d '\n' . O comando é ls -l ; modifique ao seu gosto.

Se você precisar apenas da lista de diretórios, não do conteúdo desses diretórios, elimine o xargs part:

find / '(' -iname '*.htm' -o -iname '*.html' ')' -printf '%h\n' | uniq
    
por 29.10.2016 / 14:40
0

Aqui estão alguns comandos possíveis, incluindo exemplo de saída

O mais simples:

$ find / -iname "*.htm*"
foo/a.HTM
foo/b.HTML
foo/b.html
foo/x.htmx
foo/a.htm
bar/a.htm

-iname significa localizar arquivos correspondentes à glob e não fazer distinção entre maiúsculas e minúsculas. O problema é que o glob *.htm* também encontra htmx .

Para evitar encontrar htmx , você precisa dividir o glob:

$ find / -iname "*.htm" -o -iname "*.html"
foo/a.HTM
foo/b.HTML
foo/b.html
foo/a.htm
bar/a.htm

Ou use o grep que pode usar o regex:

$ find / | grep -i "\.html*$"
foo/a.HTM
foo/b.HTML
foo/b.html
foo/a.htm
bar/a.htm

Observe que o regex é diferente de glob. Especialmente o ponto ( . ) e estrela ( * ) têm significados muito diferentes em glob e regex.

Veja link para mais informações.

    
por 29.10.2016 / 14:31

Tags