allExist(){
while IFS= read -r f; do
test -e "$f" || return 1
done
}
make_list_of_files | allExist
Isso deve funcionar em todos os shells POSIX.
Eu tenho um comando que me fornece uma lista de arquivos, um em cada linha. Os nomes dos arquivos são "normais" - sem espaços, sem necessidade de parênteses, etc.
Agora eu quero canalizar esse comando para algo como test -f
e retornar true se e somente se todos dos arquivos existirem. (Comportamento com 0 linhas pode ser indefinido, eu realmente não me importo.)
Então, algo como
make_list_of_files | test -f
mas realmente trabalhando.
"Bashisms" são permitidos, já que eu preciso disso no Bash.
Os arquivos não estão no mesmo diretório, mas estão em subdiretórios de um diretório atual, e os caminhos têm nomes de diretório neles, por exemplo
dir/file1
dir/file2
dir2/file3
Isso se torna muito mais fácil usando xargs, que retorna um código de status de 123 se algum comando retorna um status diferente de zero:
if make_list_of_files | xargs ls &>/dev/null; then
echo "All files exist";
else
echo "here";
fi
Isso também pode ser feito como uma linha em (ba) sh:
$ make_list_of_files | xargs ls &>/dev/null || echo "missing file"
$ make_list_of_files | xargs ls &>/dev/null && echo "all files present"
Tags bash files shell-script