Teste para existência de múltiplos arquivos, dados por pipe

4

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
    
por Karel Bílek 13.11.2015 / 00:18

2 respostas

7
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.

    
por 13.11.2015 / 00:29
2

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"
    
por 13.11.2015 / 05:56