最简单的Bash代码,用于查找目录中不存在定义列表中的哪些文件?

时间:2012-03-11 23:27:30

标签: bash

这就是我想出的。它运作得很完美 - 我只是好奇,如果有一个更小/更脆的方式来做它。 (想知道是否可能没有循环)

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

4 个答案:

答案 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