如果我有BASH变量:
Exclude="somefile.txt anotherfile.txt"
如何获取目录的内容,但将上述内容排除在列表中的文件中?我希望能够做到这样的事情:
Files= #some command here
someprogram ${Files}
someprogram
应该被赋予特定目录中的所有文件,但${Exclude}
变量中的文件除外。修改someprogram
不是一种选择。
答案 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// /|})))