从find中排除文件列表

Tho*_*son 36 linux shell find

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

find /dir -name "*.gz" -exclude_from skip_files
Run Code Online (Sandbox Code Playgroud)

并获取/ dir中的所有.gz文件,但skip_files中列出的文件除外.但是找不到-exclude_from旗帜.如何跳过所有文件skip_files

Jos*_*lly 50

我不认为find有这样的选项,您可以使用printf和您的排除列表构建命令:

find /dir -name "*.gz" $(printf "! -name %s " $(cat skip_files))
Run Code Online (Sandbox Code Playgroud)

这跟做的一样:

find /dir -name "*.gz" ! -name first_skip ! -name second_skip .... etc
Run Code Online (Sandbox Code Playgroud)

或者你可以管道find进入grep:

find /dir -name "*.gz" | grep -vFf skip_files
Run Code Online (Sandbox Code Playgroud)


Mar*_*n G 14

这是我通常从结果中删除一些文件的方法(在这种情况下,我查找了所有文本文件,但对我们在这里和那里的一堆valgrind memcheck报告不感兴趣):

find . -type f -name '*.txt' ! -name '*mem*.txt'
Run Code Online (Sandbox Code Playgroud)

它似乎工作.

  • 如果您需要忽略多个文件名/模式的示例:`find . -输入f!-名称'.foo'!-名称'.bar'`。 (2认同)

Jay*_*hoi 8

我想你可以试试

find /dir \( -name "*.gz" ! -name skip_file1 ! -name skip_file2 ...so on \)
Run Code Online (Sandbox Code Playgroud)


Soh*_*han 6

find /var/www/test/ -type f \( -iname "*.*" ! -iname  "*.php" ! -iname "*.jpg" ! -iname "*.png"  \)
Run Code Online (Sandbox Code Playgroud)

上面的命令给出了所有文件的列表,不包括扩展名为 .php、.jpg 和 .png 的文件。这个命令在腻子中对我有用。


小智 5

Josh Jolly 的 grep 解决方案可以工作,但复杂度为 O(N**2),对于长列表来说速度太慢。如果列表首先排序(O(N*log(N)) 复杂度),则可以使用comm,其复杂度为 O(N):

find /dir -name '*.gz' |sort >everything_sorted
sort skip_files >skip_files_sorted
comm -23 everything_sorted skip_files_sorted | xargs . . . etc
Run Code Online (Sandbox Code Playgroud)

man您的计算机的comm详细信息。