使用shell脚本过滤目录列表

时间:2009-03-10 00:44:10

标签: bash shell

如果我有BASH变量:

Exclude="somefile.txt anotherfile.txt"

如何获取目录的内容,但将上述内容排除在列表中的文件中?我希望能够做到这样的事情:

Files=  #some command here
someprogram ${Files}

someprogram应该被赋予特定目录中的所有文件,但${Exclude}变量中的文件除外。修改someprogram不是一种选择。

4 个答案:

答案 0 :(得分:2)

我不确定你是否正在使用unix shell脚本,但是这里是 bash的一个工作示例:

#!/bin/bash

Exclude=("a" "b" "c")
Listing=(`ls -1Q`)

Files=( $(comm -23 <( printf "%s\n" "${Listing[@]}" ) <( printf "%s\n" "${Exclude[@]}"
) ) )

echo ${Files[@]}

请注意,我使用双引号括起Exclude中的每个文件名并添加 他们周围的括号。将echo替换为someprogram,更改ls命令 到你想检查的目录,你应该让它工作。 这里的comm程序是关键。

答案 1 :(得分:1)

您可以使用find。类似的东西:

FILES=`find /tmp/my_directory -type f -maxdepth 1 -name "*.txt" -not -name somefile.txt -not -name anotherfile.txt`

其中/ tmp / my_directory是您要搜索的路径。

如果你想要一个简单的for循环,你可以从Excludes中建立“-not -name blah -not -name blah2”列表......

答案 2 :(得分:0)

这是标准Unix命令行的一个内容:

ls | grep -v“^ $ {Exclude} $”| xargs

确实有一个假设。 $ {Exclude}需要正确转义,因此像句号这样的字符不会被解释为正则表达式的一部分。

答案 3 :(得分:0)

假设文件名没有空格或其他病态字符:

shopt -s extglob
Files=(!(@(${Exclude// /|})))