Localiza arquivos em vários nomes de pastas

36

Estou tentando listar todos os arquivos de dir1 , dir2 , dir3 e dir4 , que podem estar em qualquer lugar como um subdiretório de cwd usando o comando find . Eu tentei o seguinte sem sucesso:

find . -type f -regextype posix-egrep -regex 'dir1/.+|dir2/.+|dir3/.+|dir4/.+'

Eu também tentei posix-extended . Como posso listar esses arquivos?

    
por Aaron 10.01.2013 / 07:10

7 respostas

48

E se você quiser pesquisar três pastas chamadas foo , bar e baz para todos os arquivos *.py , use este comando:

find foo bar baz -name "*.py"

, portanto, se você quiser exibir arquivos de dir1 dir2 dir3 use find dir1 dir2 dir3 -type f

experimente este find . \( -name "dir1" -o -name "dir2" \) -exec ls '{}' \;

    
por 10.01.2013 / 07:16
4

É melhor usar a diretiva -path:

find .  \( -type f -and -path '*/dir1/*' -or -path '*/dir2/*' -or -path '*/dir3/*' -or -path '*/dir4/*' \)

O que significa: encontrar todos os arquivos no diretório atual, onde há 'dir1' ou 'dir2' ou 'dir3' ou 'dir4' no caminho.

    
por 08.09.2013 / 15:18
3

Só para que todos saibam. Adicionar .*/ antes de cada dir resolveu o problema, pois o regex está correspondendo ao caminho completo que parece.

    
por 11.01.2013 / 01:12
3

Esta é a minha primeira ideia depois de ler as respostas anteriores:

find . -type f -regextype posix-egrep -regex ".*/(dir1|dir2|dir3|dir4)/.+"

Isso leva em consideração que o regex deve corresponder ao nome do arquivo inteiro e é mais fácil de entender.

    
por 16.04.2013 / 15:31
2

Exemplo de rápida (!) localização de arquivos específicos (access_log) em vários locais definidos por curinga (diretório inicial) e diretório de log apache2 geral, aplicando também filtragem de nome para excluir logs ssl e logs antigos gzipped. Não responde diretamente a pergunta aqui, mas pode ser útil para alguém que encontrou essas instruções (como eu).

find / \( -path "*var/log/apache2*" -o -path "*home/*/logs*" \) -type f  -name "*access_log" ! -name "*ssl*"

Tenha cuidado com espaços, especialmente perto de \( e \) .

A propósito, eu usei para o apachetop, para encontrar os sites mais ativos no meu servidor.

apachetop -d1 -s9 -p $(find / \( -path "*var/log/apache2*" -o -path "*home/*/logs*" \) -type f  -name "*access_log" ! -name "*ssl*" -print | sed 's/^/-f '/)
    
por 08.04.2014 / 08:53
2

você não precisa especificar dir1 a dir4 pelo nome se estiver usando regextype

find . -type f -regextype sed -regex ".*/dir[1-4]/[^/]*"
  • type f : localizar arquivos e não diretórios
  • regextype sed : usa o regextype sed
  • regex : pesquisa usando regex em todo o caminho
  • ".*/dir[1-4]/[a-z0-9]*" :. * no começo significa qualquer número de caracteres que podem ser do tipo (char / number / backslash (/) etc); dir [1-4] significa procurar por "dir" seguido por um número entre 1 e 4; / [^ /] * afirma que seguir dir1-4 omitir quaisquer nomes de caminho que tenham / neles, portanto, ele só retorna arquivos no diretório dir1-dir4 e ignora quaisquer subdiretórios que possam estar dentro de dir1-dir4.

criou um diretório para você testá-lo: link

    
por 04.09.2017 / 22:10
0

Primeiro, desculpe pelo meu inglês ruim. Segundo, eu sei que você especificou que usando find, mas apenas para mostrar outras opções que podem ser usadas, você pode usar xargs:

find . -type d | grep -E "dir1$|dir2$" | xargs ls  

find . -name "dir1" -or -name "dir2" | xargs ls

Você pode ter um arquivo chamado "pastas" que contém algo como:

$ cat folders
dir1
dir2
dir3
dir4

Depois, você pode fazer algo assim:

$ cat folders | xargs -I % find . -type d -name % | xargs ls
./Documents/dir1:
file1  file2  file3  file4

./Documents/dir2:
file1  file2  file3  file4

./Documents/dir3:
file1  file2  file3  file4

./Documents/dir4:
file1  file2  file3  file4

xargs na minha opinião, me sinto mais versátil do que encontrar -exec. Além disso, você pode fazer algumas coisas malucas como

$ cat << EOF | xargs -I {} find ~ -name "{}" | xargs ls
> dir1
> dir2
> dir3
> EOF
/home/user/Documents/dir1:
file1  file2  file3  file4

/home/user/Documents/dir2:
file1  file2  file3  file4

/home/user/Documents/dir3:
file1  file2  file3  file4
    
por 10.05.2018 / 14:36