作为文件/目录命名的标准,我使用类似将日期和标签字符串放入文件名中并用下划线分隔的方法,例如:
2015_03_10_usa_nyc_vacations_album_pictures
很长一段时间以来,我一直使用像 Recoll 这样的软件,但通常它提供的记录比我需要的多得多。由于我的命名非常一致,我认为应该有一种方法使用 find 命令对其进行脚本化。
尽管我知道如何对单个条件执行查找搜索,但我不确定如何查找多个条件/条件。也就是如何找到所有名称满足一定条件的文件。让我们考虑以下包含以下内容的示例:
- {2015} AND { {专辑} OR {图片} }
- {专辑} AND {假期} AND NOT {2015}
答案1
对于第一个
find DIR \( -name 2015\* -a \( -name \*album\* -o -name \*picture\* \) \) -delete
在哪里
- 你必须逃离
*
以避免扩张 - 你必须转义 ( 和 ) 以避免 subshell
- 替换
-delete
成你喜欢的任何东西
第二个留作家庭作业(提示\!
)
答案2
通常是不值得输入如下内容:
find /dir -regex '.*2015.*\(album.*\|picture.*\)'
不要浪费时间,使用 grep 和“每个任务一个工具”的 UNIX 概念:
find /dir | egrep '2015.*(album|picture)'
优点:
- 更少输入,更快获得结果
- 更具可读性(没有 \,不必要的 .*)
- 可能运行得更快——管道命令允许内核在两个 CPU 之间进行平衡,是的,我现在在普通控制台中进行了测试)
- 如果您想从文件列表或其他源中读取内容,则行为类似
答案3
对于第一个find
来说-regex
会很好:
find /dir -regex '.*2015.*\(album.*\|picture.*\)'
对于第二个:
find . -name "*album*" -a -name "*vacations*" -a -not -name "*2015*"