Bash,不包括for循环和引用中的文件

时间:2014-11-20 09:55:49

标签: bash for-loop quotes

我有一个目录中的文件,我想在for循环中处理,同时排除一些(以前处理过的)文件。我正在使用!()来排除文件,但是当要排除的文件在文件名中有空格并且我从文件中读取文件名时,如何引用我的变量?

当我明确说明要明确排除的文件时,我可以毫无问题地使用!()

$ mkdir test
$ cd test
$ touch this.txt and\ this.txt not\ this.txt nor\ this.txt

$ for THEFILE in !(not this.txt|nor this.txt); do 
    echo $THEFILE
  done

and this.txt
this.txt

但是当我介绍排除文件并且文件名中有空格的文件时,我很难正确引用我的变量。这是没有引号的输出:

$ cd ..
$ SRCDIR=test
$ EXCLUDEFILE=excludes.txt
$ cat > excludes.txt
not this.txt|nor this.txt
^D

$ for THEFILE in $SRCDIR/!($(cat $EXCLUDEFILE)); do
  echo $THEFILE
done

test/!(not
this.txt|nor
this.txt)

这是一个引号:

$ for THEFILE in $SRCDIR/!("$(cat $EXCLUDEFILE)"); do
  echo $THEFILE
done

test/and this.txt
test/nor this.txt
test/not this.txt
test/this too.txt
test/this.txt

我尝试过其他一些变化,但没有成功。拜托,教育我。

2 个答案:

答案 0 :(得分:0)

简单易用的解决方法是

filter=$(cat excludes.txt)
for THEFILE in $SRCDIR/*; do
    case "|$filter|" in *"|$THEFILE$|"*) continue;; esac
    echo "$THEFILE"
done

我可能会使用换行作为excludes.txt中的分隔符,尽管这会使代码变得更加简单。要获得完全可靠的处理,请使用字面零字节,或者(如果您永远不需要处理目录)斜杠。

答案 1 :(得分:0)

好的,我放弃了cat并选择了while

$ for THEFILE in $SRCDIR/!($(while read i; do echo -n $i\|;done<$EXCLUDEFILE)); do 
  echo $THEFILE
done

test/and this.txt
test/foo.txt
test/this too.txt
test/this.txt

现在似乎有效。

我讨厌cat