从find中排除文件列表

时间:2014-03-21 12:02:45

标签: linux shell find

如果我在运行find时想要排除的文本文件中有文件名列表,我该怎么办?例如,我想做类似的事情:

find /dir -name "*.gz" -exclude_from skip_files

并获取/ dir中的所有.gz文件,但skip_files中列出的文件除外。但是find没有-exclude_from标志。如何跳过skip_files中的所有文件?

6 个答案:

答案 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 {} \;)时很有用。

  1. 您可以创建一个shell脚本来处理跳过逻辑并在找到的文件上运行命令(将其用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
  1. 使用要跳过的文件列表创建名为files_to_skip.txt的文件(在运行目录上)。

  2. 然后使用查找来使用它:

    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的详细信息。