Encontra o arquivo por correspondência em seu caminho

7

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.

    
por Mees de Vries 15.05.2017 / 13:39

4 respostas

8

tente isso

find */subdir -type f
    
por Carl 15.05.2017 / 13:46
8

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
    
por terdon 15.05.2017 / 14:11
2

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.

    
por Ravexina 15.05.2017 / 16:37
1

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.

    
por Olivier Dulac 15.05.2017 / 19:59