Como percorrer arquivos cujos nomes contenham linhas verticais e espaços no bash

0

Esta solução clássica (quando há apenas espaços nos nomes) não funcionou

find . -name '*.html' -print0 | while IFS= read -r -d ''; do

porque os arquivos html contêm adicionalmente linhas verticais ( | ).

    
por alxprogger 27.08.2017 / 12:19

2 respostas

3
find . -name '*.html' -print0 | while IFS= read -r -d ''; do

Não há nada nessa linha que tenha algum tipo de problema com nomes de arquivos contendo combinações de espaços e / ou canais em seus nomes:

bash-4.4$ touch 'A|B' '1|2' 'quux|foo bar'
bash-4.4$ ls
1|2          A|B          quux|foo bar
bash-4.4$ find . -print0 | while IFS= read -r -d ''; do printf '"%s"\n' "$REPLY"; done
"."
"./A|B"
"./1|2"
"./quux|foo bar"

Observe também que, dependendo do que você gostaria de fazer com os nomes encontrados, é quase sempre melhor fazer isso com um -exec de dentro de find :

find . -type f -name "A*" -exec cat {} \;

Resposta relacionada a outra pergunta: Por que meu script de shell sufoca em espaço em branco ou outros caracteres especiais? (consulte especialmente "Como processar arquivos encontrados por find?" nessa resposta).

    
por 27.08.2017 / 12:44
0

Você só precisa de uma invocação tão simples de find para versões muito antigas de bash (pré-4.0). Usar o operador globstar é muito mais simples:

shopt -s globstar
for f in **/*.html; do
    ...
done
    
por 28.08.2017 / 23:49

Tags