我最近陷入了陷入困境,相信如果我在find
中bash
修剪某些文件,然后只找到剩余的文件(不是目录),那么输出将是剩下的文件。
它没有按照我的预期发挥作用。
这是一个简化的例子。我的目录结构如下:
a
├── 1.log
├── 1.tgz
├── 1.txt
├── b
│ ├── 2.log
│ ├── 2.tgz
│ └── 2.txt
├── c
│ ├── 3.log
│ ├── 3.tgz
│ └── 3.txt
└── d
└── e
├── 4.log
├── 4.tgz
└── 4.txt
假设我想仅查找不是*.log
或*.tgz
的文件。 (我意识到剩下的就是*.txt
个文件,所以有一个明显的方法可以找到那些,但情况并非总是如此,所以请放纵我。)
我原来的命令是:
find a \( -name '*.log' -o -name '*.tgz' \) -prune -o -type f
我希望这可行,但它列出了所有文件:
a/1.log
a/b/2.tgz
a/b/2.txt
a/b/2.log
a/d/e/4.log
a/d/e/4.txt
a/d/e/4.tgz
a/1.txt
a/1.tgz
a/c/3.tgz
a/c/3.txt
a/c/3.log
根据man
的{{1}}页面:
如果整个表达式不包含-prune或-print以外的任何操作,则对整个表达式为true的所有文件执行-print。
在我看来,整个表达式仅适用于find
文件。如果我做一些简单的事情:
*.txt
根据上述内容隐含find a -type f
,并列出所有文件。
让我感到困惑的是,如果我将-print
添加到原始命令的末尾,它就像我期望的那样工作:
-print
由于我有点期望隐含a/b/2.txt
a/d/e/4.txt
a/1.txt
a/c/3.txt
,我不会指望它会产生任何影响,但显然它会有效。
有人可以解释一下我应该如何在精神上解析这些-print
命令,以便我不再陷入这样的陷阱吗?