如果我在运行时想要排除的文本文件中有文件名列表,我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 /dir \( -name "*.gz" ! -name skip_file1 ! -name skip_file2 ...so on \)
Run Code Online (Sandbox Code Playgroud)
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
详细信息。