有一个选项可用于grep -f MY_FILE让它搜索从文件中获取的模式,而不是直接在命令行上指定。
是否可以选择对find命令执行类似操作并让它读取模式以从输入文件中进行搜索?
find似乎没有内置这样的功能,但是您可以使用文件中的参数xargs来构造多个find命令,例如:
xargs -a patterns.txt -I% find Pictures/ -name %
Run Code Online (Sandbox Code Playgroud)
哪里patterns.txt是适合-name过滤器的模式列表,每行一个模式。请注意,那里没有前导/尾随空格,因为它们会包含在模式中。一个例子:
*.jpg
2018-06-*
*foo*
unicorn.png
Run Code Online (Sandbox Code Playgroud)
注意:虽然这个答案看起来很简单和优雅,但在评论中正确指出它有一些缺点:
对于大文件夹或许多模式,性能不太好,因为它会为
find文件中的每个模式运行一次,导致它重复扫描整个搜索文件夹。因此,如果您有多个可能重叠的模式(如
*.jpg和*foo*),匹配多个模式的文件将在结果中出现多次。如果您只是打印名称,您可以通过管道输出sort -u删除重复项,但如果您删除这些结果或-exec对它们运行任何命令,这可能更不受欢迎。如果这些缺点中的任何一个对您的用例来说是个问题,也许最好选择其他答案之一。
命令的解释:
xargs 将读取参数列表并使用它们来构建和运行新的命令行。 -a patterns.txt 告诉它从该文件而不是标准输入中读取。 -I%告诉它不要简单地将它读取的参数附加到命令行的末尾,而是%用一个参数替换您提供的命令行中的字符。这意味着为每个输入参数创建和运行一个单独的命令。 find Pictures/ -name %是我们想要插入参数的命令行,替换%. 您不需要在此处引用,因为xargs会注意它插入的每个参数都将被视为单个标记,而不是单独拆分。您当然可以Pictures/用您自己的搜索目录替换,也可以使用不同的和/或更多过滤器,而不仅仅是-name. 因为我们使用插入选项,您还可以-exec ...在命令的末尾附加类似的操作。