如果我在运行find
时想要排除的文本文件中有文件名列表,我该怎么办?例如,我想做类似的事情:
find /dir -name "*.gz" -exclude_from skip_files
并获取/ dir中的所有.gz文件,但skip_files中列出的文件除外。但是find没有-exclude_from
标志。如何跳过skip_files
中的所有文件?
答案 0 :(得分:43)
我不认为find
有这样的选项,您可以使用printf
和排除列表构建命令:
find /dir -name "*.gz" $(printf "! -name %s " $(cat skip_files))
与做的相同:
find /dir -name "*.gz" ! -name first_skip ! -name second_skip .... etc
或者,您可以从find
管道传输到grep
:
find /dir -name "*.gz" | grep -vFf skip_files
答案 1 :(得分:9)
这是我通常从结果中删除一些文件的方法(在这种情况下,我查找了所有文本文件,但对我们在这里和那里的一堆valgrind memcheck报告不感兴趣):
find . -type f -name '*.txt' ! -name '*mem*.txt'
似乎有效。
答案 2 :(得分:8)
我认为你可以尝试
find /dir \( -name "*.gz" ! -name skip_file1 ! -name skip_file2 ...so on \)
答案 3 :(得分:2)
find /var/www/test/ -type f \( -iname "*.*" ! -iname "*.php" ! -iname "*.jpg" ! -iname "*.png" \)
上面的命令提供了所有文件的列表,不包括扩展名为.php,.jpg ang .png的文件。这个命令适合我在putty。
答案 4 :(得分:1)
此解决方案将遍历所有文件(不完全排除find
命令中的文件),但是将生成一个输出,从排除列表中跳过文件。
我发现这在运行耗时的命令(file /dir -exec md5sum {} \;
)时很有用。
chmod
执行,用其他命令替换echo
): $ cat skip_file.sh
#!/bin/bash
found=$(grep "^$1$" files_to_skip.txt)
if [ -z "$found" ]; then
# run your command
echo $1
fi
使用要跳过的文件列表创建名为files_to_skip.txt
的文件(在运行目录上)。
然后使用查找来使用它:
find /dir -name "*.gz" -exec ./skip_file.sh {} \;
答案 5 :(得分:0)
Josh Jolly的grep解决方案可以工作,但是具有O(N ** 2)复杂度,对于长列表来说太慢了。如果列表排在第一位(复杂度为O(N * log(N))),则可以使用复杂度为O(N)的comm
:
find /dir -name '*.gz' |sort >everything_sorted
sort skip_files >skip_files_sorted
comm -23 everything_sorted skip_files_sorted | xargs . . . etc
man
是计算机comm
的详细信息。