Bash - Como faço loop através de subdiretórios e extrai os arquivos

2

Eu tenho um diretório chamado 10K_TIF (diretório principal). Dentro deste diretório principal existem vários subdiretórios, cada um contendo imagens tif. Eu quero ler cada imagem TIF e extrair seu caminho usando um comando bash. 10K_TIF com mais de 15 TB de tamanho.

Amostra:

10K_TIF/4320cc/4320cc_01_rectified.tif
10K_TIF/4320cc/4320cc_02_rectified.tif
10K_TIF/4520cc/4520cc_01_rectified.tif
10K_TIF/4520cc/4520cc_02_rectified.tif

Eu consegui ecoar cada sub diretório, também consegui ecoar todas as imagens tif, mas estas estão em comandos separados.

    
por S Coetzer 26.09.2014 / 15:18

4 respostas

2

Você pode usar find :

find 10K_TIF -iname '*TIF'

Para repetir os resultados e fazer algo com cada imagem, você pode usar:

find 10K_TIF -iname '*TIF' | while read tif; do echo "Found: $tif"; done

O acima pressupõe nomes de arquivos sãos, sem espaço em branco ou caracteres estranhos. Se os nomes dos seus arquivos puderem incluir esses caracteres, use isso:

find 10K_TIF -iname '*TIF' -print0 | 
    while IFS= read -r -d '' tif; do echo "Found: $tif"; done
    
por 26.09.2014 / 15:27
1
find 10K_TIF -iname "*.tif"

E se você quiser processar cada arquivo, como encontrar o tipo de conteúdo do arquivo

find 10K_TIF -iname "*.tif" -print0 | xargs -0 -n1 file

Ou para calcular md5sum

find 10K_TIF -iname "*.tif" -print0 | xargs -0 -n1 md5sum
    
por 26.09.2014 / 15:40
1

Se você quiser (apenas) listar todos os arquivos * .tiff em todos os subdiretórios com bash , é mais fácil usar ** pattern (globstar):

shopt -s globstar
ls **/*.tiff
    
por 26.09.2014 / 15:46
0

Você pode usar find para localizar todos os arquivos e passá-los para qualquer comando que queira usar usando

find 10K_TIF -iname "*.tif" -type f -print0 | xargs -0 -n1 <command>

Isso pesquisa 10K_TIF e todos os subdiretórios, correspondendo tudo o que termina com .tif (insensibilidade a maiúsculas) e é um arquivo regular (ou seja, diretórios, arquivos especiais e links simbólicos terminados em .tif não são processados).

Se você quiser processar, por exemplo, links simbólicos e arquivos regulares, você pode usar

find 10K_TIF -iname "*.tif" \( -type f -o -type l \) -print0 | xargs -0 -n1 <command>
    
por 26.09.2014 / 15:53