我需要查找名称中包含数字且不包含以 .counts.txt 结尾的文件的所有文件夹。通过结合我在网上找到的几个建议,我能够想出以下命令(针对 bash),它可以实现我想要的功能。
find . maxdepth 1 -type d -name "*[0-9]*" ! -exec sh -c 'ls -1 "{}" | egrep -q "*.counts.txt"' \; -print
但是,我不明白它的一些功能:
- 这里的感叹号有什么作用呢?它是否以某种方式否定了后面的条件语句?
- 为什么需要使用
sh
而不是直接通过管道打开一个新的外壳ls
?
答案1
- 是的,它
!
否定了下一个条件,即-exec sh -c 'ls -1 "{}" | egrep -q "*.counts.txt"' \;
.由于这是一个-exec
被否定的条件,我们必须记住,如果它执行的命令返回状态 0,则为真(如果状态不为 0,则否定条件为真)。 - 之后的参数
-exec
不会传递给 shell,而是直接执行,因此不存在可用管道的概念。如果您将管道字符放在那里,外壳(开始查找自身)将使用它并且全部find 的输出将发送到egrep。
请man find
参阅 参考资料 中的文档!
和-exec
查找参数。