No bash, costumo usar for-loops, como os seguintes
for file in *.type; do
sommecommand "$file";
done;
para executar uma operação para todos os arquivos correspondentes *.type
. Se nenhum arquivo com essa finalização for encontrado nos diretórios de trabalho, o asterisco não será expandido e, normalmente, receberei uma mensagem de erro informando que algum comando não encontrou o arquivo. Posso pensar imediatamente em várias maneiras de evitar esse erro. Mas adicionar um condicional não parece ser muito elegante. Existe uma maneira curta e limpa de conseguir isso?
*.txt
. Valeria a pena verificar se o arquivo existe.break
vez decontinue
).No bash, você pode usar
shopt -s nullglob
para expandir para uma matriz vazia, se não houver correspondências.Em cartuchos POSIX sem
nullglob
, você pode evitar esse problema verificando se o nome do arquivo que está sendo passado realmente existe, tendo[ -e "$file" ] || [ -L "$file" ] || continue
como primeira parte do seufor
loop.fonte
[ -e
retornaria false para arquivos inacessíveis ou arquivos que são links simbólicos para arquivos inacessíveis ou inexistentes.chmod 0 the_file
,[ -e the_file ]
ainda avalia verdade, por isso deve ser outra coisa.mkdir -p x/{a,b} && chmod 444 x && echo x/* && [ -e x/a ]
,. x / a está inacessível, mas como x é legível x / * será expandido.A técnica usual para conchas que não têm
nullglob
opção éO extra
[*].type
é para cobrir o caso em que há um arquivo chamado*.type
no diretório atual.Agora, se você deseja incluir arquivos de ponto, isso se torna mais complicado .
Acredito que a técnica foi cunhada por Laura Fairhead na usenet há alguns anos atrás.
fonte
find . -name '*.type' -maxdepth 0 -exec somecommand "{}" ";"
Isso remove completamente o
for
loop e o brilho da concha da equação.find
executará o-exec
comando uma vez por partida e, se não houver correspondências, nunca será executado. Os-maxdepth 0
instrutores descobrem que não se recursão em subdiretórios do caminho-argumento nomeado (.
, neste caso).A desvantagem é que ele envolve outro aplicativo, embora esteja presente em praticamente todos os sistemas Linux existentes (e provavelmente na maioria dos Unixes).
fonte