请在find命令

时间:2017-08-23 11:27:57

标签: bash find

我最近陷入了陷入困境,相信如果我在findbash修剪某些文件,然后只找到剩余的文件(不是目录),那么输出将是剩下的文件。

它没有按照我的预期发挥作用。

这是一个简化的例子。我的目录结构如下:

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命令,以便我不再陷入这样的陷阱吗?

0 个答案:

没有答案