tente isso
find */subdir -type f
Eu tenho um diretório contendo vários subdiretórios. Cada um desses subdiretórios contém um subdiretório, todos com o mesmo nome. Eu gostaria de produzir uma lista de todos esses arquivos na linha de comando. Então, por exemplo, se eu tiver:
dir1/
file1.txt
subdir/
relevant_file1.c
relevant_file2.c
dir2/
file2.txt
subdir/
relevant_file3.txt
relevant_file4.java
dir3/
subdir/
relevant_file5.cpp
irrelevant_subdir/
unimportant_file.txt
dir4/
subdir/
Eu gostaria de ter a seguinte saída:
dir1/subdir/relevant_file1.c
dir1/subdir/relevant_file2.c
dir2/subdir/relevant_file3.txt
dir2/subdir/relevant_file4.java
dir3/subdir/relevant_file5.cpp
Eu presumo que isso não deva ser muito difícil usando find
, mas eu ainda não consegui descobrir. É difícil procurar por esse problema porque é tão específico, e apenas procurar por "localizar arquivo por correspondência em seu caminho" não produz nada útil.
tente isso
find */subdir -type f
Você realmente não precisa de find
para isso. Um simples ls
serve:
$ ls -1 */subdir/*
dir1/subdir/relevant_file1.c
dir1/subdir/relevant_file2.c
dir2/subdir/relevant_file3.txt
dir2/subdir/relevant_file4.java
dir3/subdir/relevant_file5.cpp
Ou, se você quiser fazer algo com esses arquivos e não apenas listá-los, use shell globs:
for file in */subdir/*; do command "$file"; done
Claro, isso listará qualquer coisa em qualquer subdiretório chamado subdir
. Incluindo diretórios, links simbólicos, arquivos de dispositivos ou qualquer outra coisa. Se você quiser limitá-lo aos arquivos normais, use find "*/subdir" -type f
conforme sugerido por @Carl, ou adicione um teste de arquivo:
for file in */subdir/*; do [ -f "$file" ] && command "$file"; done
Uma solução melhor com find
é usar a opção -path
.
find -path "*/subdir/*" -type f
É mais útil quando temos uma estrutura mais complexa. algo como:
.
├── dir1
│ ├── gooddir
│ │ └── subdir
│ │ └── file.txt
│ ├── irrelevant_subdir
│ │ └── file.txt
│ └── subdir
│ └── file.txt
└── dir2
├── gooddir
│ └── subdir
│ └── file.txt
├── irrelevant_subdir
│ └── file.txt
└── subdir
└── file.txt
No exemplo acima, algo como find */subdir -type f
só encontra arquivos em um primeiro subdir
. No entanto, find -path "*/subdir/*" -type f
funcionará bem.
Use apenas a ferramenta apropriada:
locate "/subdir/"
Você pode querer (re) executar:
sudo updatedb
se você precisar atualizar o banco de dados do locate (por exemplo, se você quiser encontrar arquivos adicionados recentemente), mas ele deve ser construído via crontabs todos os dias (se o pc estiver rodando na hora)
Se você precisar do initialb inicial, ele pode parecer mais lento do que o find específico, mas no final é muito mais rápido, já que todas as consultas subsequentes são feitas RAPIDAMENTE.
Tags command-line directory bash find