这就是我想出的。它运作得很完美 - 我只是好奇,如果有一个更小/更脆的方式来做它。 (想知道是否可能没有循环)
files='file1|file2|file3|file4|file5'
path='/my/path'
found=$(find "$path" -regextype posix-extended -type f -regex ".*\/($files)")
for file in $(echo "$files" | tr '|', ' ')
do
if [[ ! "$found" =~ "$file" ]]
then
echo "$file"
fi
done
答案 0 :(得分:1)
您可以在不调用任何外部工具的情况下执行此操作:
IFS="|"
for file in $files
do
[ -f "$file" ] || printf "%s\n" "$file"
done
答案 1 :(得分:0)
如果您的文件名包含空格,则代码将中断。我就是这样做的,这有点简洁。
echo "$files" | tr '|' '\n' | while read file; do
[ -e "$file" ] || echo "$file"
done
如果你想彻底摆脱循环,你可以使用xargs
。
答案 2 :(得分:0)
$ eval "ls $path/{${files//|/,}} 2>&1 1>/dev/null | awk '{print \$4}' | tr -d :"
或使用awk
$ echo -n $files | awk -v path=$path -v RS='|' '{printf("! [[ -e %s ]] && echo %s\n", path"/"$0, path"/"$0) | "bash"}'
答案 3 :(得分:0)
文件名中没有空格:
files=(mbox todo watt zoff xorf)
for f in ${files[@]}; do test -f $f || echo $f ; done