测试多个文件是否存在,由管道给出

测试多个文件是否存在,由管道给出

我有一个命令给我一个文件列表,每行一个。文件名是“正常的”——没有空格,不需要转义括号等。

现在我想将该命令传递给类似的命令test -f并返回 true 当且仅当全部的文件存在。 (0 行的行为可能是未定义的,我并不关心。)

因此,

make_list_of_files | test -f

但实际上在工作。

“Bashism”是允许的,因为我在 Bash 中需要它。

这些文件不在同一目录中,但它们位于当前目录的子目录中,并且路径中包含目录名称,例如

dir/file1
dir/file2
dir2/file3

答案1

allExist(){
    while IFS= read -r f; do
      test -e "$f" || return 1
    done
}

make_list_of_files | allExist

这应该适用于所有 POSIX shell。

答案2

使用 xargs 会变得更加容易,如果任何命令返回非零状态,它会返回状态代码 123:

if make_list_of_files | xargs ls &>/dev/null; then
    echo "All files exist";
else
    echo "here";
fi

这也可以在 (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"

相关内容