寻找 是日常工具箱中功能更强大、更灵活的命令行程序之一。 顾名思义,它会查找与您指定的条件匹配的文件和目录。 还有像这样的论点 -执行 或者 -删除,您可以让 find 对它……找到的内容采取行动。
在命令行快速提示系列的这一部分中,您将了解 寻找 命令并学习如何使用它来处理带有内置命令的文件或 xargs 命令。
查找文件
最低限度, 寻找 走一条路去寻找东西。对于 example,此命令将查找(并打印)系统上的每个文件:
find /
而且由于一切都是文件,因此您将获得大量输出进行排序。 这可能无法帮助您找到要查找的内容。 您可以更改路径参数以缩小范围,但它仍然没有比使用 ls 命令。 因此,您需要考虑要查找的内容。
也许您想在您的主目录中找到所有的 JPEG 文件。 这 -姓名 参数允许您将结果限制为与给定模式匹配的文件。
find ~ -name '*jpg'
可是等等! 如果其中一些具有大写扩展名怎么办? -我的名字 就好像 -姓名,但不区分大小写:
find ~ -iname '*jpg'
伟大的! 但是 8.3 的名称方案是 1985 年的。有些图片可能有 .jpeg 扩展名。 幸运的是,我们可以将模式与“或”结合起来,表示为 -o. 括号被转义,以便 shell 不会尝试解释它们而不是 寻找 命令。
find ~ ( -iname '*jpeg' -o -iname '*jpg' )
我们越来越近了。 但是,如果您有一些以 jpg 结尾的目录怎么办? (为什么你命名一个目录 桶的jpg 代替 图片 超出了我的范围。)我们可以使用 -类型 仅查找文件的参数:
find ~ ( -iname '*jpeg' -o -iname '*jpg' ) -type f
或者,也许您想找到那些名字奇怪的目录,以便以后重命名它们:
find ~ ( -iname '*jpeg' -o -iname '*jpg' ) -type d
事实证明你最近拍了很多照片,所以把范围缩小到上周发生变化的文件 -mtime (修改时间)。 这 -7 表示在 7 天或更短时间内修改的所有文件。
find ~ ( -iname '*jpeg' -o -iname '*jpg' ) -type f -mtime -7
使用 xargs 采取行动
这 xargs command 从标准输入流中获取参数并基于它们执行命令。 坚持 example 在上一节中,假设您要将主目录中上周已修改的所有 JPEG 文件复制到您将附加到数码照片显示器的拇指驱动器中。 假设您已经将拇指驱动器安装为 /media/photo_display。
find ~ ( -iname '*jpeg' -o -iname '*jpg' ) -type f -mtime -7 -print0 | xargs -0 cp -t /media/photo_display
这 寻找 命令与以前的版本略有修改。 这 -打印0 命令对输出的写入方式进行了细微的更改:它不使用换行符,而是添加了一个空字符。 这 -0 (零)选项 xargs 调整解析以期望这一点。 这很重要,因为否则对包含空格、引号或其他特殊字符的文件名的操作可能无法按预期工作。 每当您对文件执行操作时,都应该使用这些选项。
这 -t 论据 cp 很重要,因为 cp 通常期望目的地最后出现。 你可以做到这一点 xargs 使用 寻找的 -执行 命令,但 xargs 方法会更快,尤其是在有大量文件的情况下,因为它将作为单个调用运行 cp.
找到更多
这篇文章只触及了表面 寻找 可以做。 寻找 支持基于权限、所有权、访问时间等的测试。 它甚至可以将搜索路径中的文件与其他文件进行比较。 将测试与布尔逻辑相结合可以为您提供难以置信的灵活性来准确找到您正在寻找的文件。 内置命令或管道到 xargs,您可以快速处理大量文件。
本文的部分内容先前发表于 开源网站. 摄影者 沃伦·黄 在 不飞溅.