Extraindo a lista de nomes de arquivos, incluindo aqueles com espaços em branco, do find

2

Gostaria de fazer algo com cada arquivo de algum tipo em um diretório específico. Eu escrevi, em um script bash,

HANDIN_FILES='find . -type f -printf "%f\n" | head -20 '
for i in $HANDIN_FILES
do
  echo $i
done

como uma espécie de primeira versão. Isso funciona muito bem se não houver espaços em branco em nenhum nome de arquivo. Se houver um arquivo silly name.txt , então i será o primeiro silly e, em seguida, name.txt , que não é o que eu quero.

Eu sei que poderia colocar todo o material do ... done em uma opção -exec no comando find , mas gostaria de preservar a lista de arquivos em uma variável shell para uso posterior também. Alguém pode sugerir uma correção rápida que fará com que i tenha o valor silly name.txt em uma iteração durante o loop?

    
por John 03.10.2017 / 22:29

1 resposta

4

com bash 4.4 +:

readarray -td '' files < <(find . -type f -print0 | head -zn 20)
for i in "${files[@]}"; do
  something with "$i"
done

Com versões anteriores do bash:

files=()
while IFS= read -rd '' file; do
  files+=("$file")
done < <(find . -print0 | head -zn 20)

for i...

Aqui, é mais simples usar zsh :

files=(**/*(D.[1,20]))
for i ($files) something with $i

(pelo menos a lista de arquivos será classificada de forma que o primeiro 20 faça mais sentido)

Veja Por que o loop está dando resultado em má prática de saída? para outras formas de processar (ou não) find ' s saída.

    
por 03.10.2017 / 22:35

Tags