我有一个命令给我一个文件列表,每行一个。文件名是“正常的”——没有空格,不需要转义括号等。
现在我想将该命令传递给类似的命令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"