我正在使用find
bash 命令,并且我试图理解它,因为它是我正在使用的代码的一部分。在代码中,有问题的命令是 -
find -L $RAW_DIR -mindepth 2 -maxdepth 2 -name "*.bam" -o -name "*.sam" | wc -l
我一直试图通过搜索它的组件来理解这个命令。从本质上讲,我认为它试图找到以.bam
或结尾的文件的数量.sam
。我认为-maxdepth 2
意味着在此文件夹及其直接子文件夹中搜索这些文件。
我不明白的是mindepth -2
在这种情况下会发生什么。我查了一下mindeep,到处给出的解释是——
”不要在低于级别(非负整数)的级别应用任何测试或操作。 '-mindepth 1' 表示处理除命令行参数之外的所有文件。”
对我来说这个解释不是很清楚。就像maxdepth -2
意味着搜索深度为 2 的子文件夹一样,mindepth -2
用简单的语言来说,相应的意思是什么?
另外,如果 mindepth 在方向上与 maxdepth 相反(这具有直观意义),那么我如何理解在确实有文件的文件夹上执行上面的命令.bam
会导致输出的事实 0,而省略命令的 mindepth 部分会导致输出1?
答案1
深度 0 是命令行参数,1 是其中包含的文件,2 是深度 1 中包含的文件,等等。
-mindepth N
告诉只处理深度 >= N 的文件,类似于告诉-maxdepth M
只处理深度 <= M 的文件。因此,如果您想要深度为 2 的文件,那么您需要同时使用两者。
您的命令会匹配$RAW_DIR/foo/bam.bam
,但不会$RAW_DIR/bar.bam
。
尝试一下,例如
$ mkdir -p a/b/c/d
$ find ./a -maxdepth 2
./a
./a/b
./a/b/c
$ find ./a -mindepth 2
./a/b/c
./a/b/c/d
$ find ./a -maxdepth 2 -mindepth 2
./a/b/c
maxdepth
带有否定参数没有任何意义:
$ find ./a -maxdepth -2
find: Expected a positive decimal integer argument to -maxdepth, but got ‘-2’
答案2
-mindepth 2
和参数-maxdepth 2
一起将 的范围限制find
为 的深度为 2 的目录$RAW_DIR
。
该命令与shell 命令find
相同bash
printf '%s\n' "$RAW_DIR"/*/*.{sam,bam} | wc -l
这将计算的子目录中的.sam
和文件的数量。不过,对于没有文件,它仍然会给出 1 的计数,但就像该命令一样,它会将名称中嵌入换行符的文件计数为两个文件。.bam
$RAW_DIR
find
对于绝对正确的find
命令,将包含嵌入换行符的文件名计为一文件:
find . "$RAW_DIR" -type f -mindepth 2 -maxdepth 2 \
'(' -name '*.bam' -o -name '*.sam' ')' -exec echo x ';' | wc -l
这将为x
每个找到的符合条件的文件单独输出一个,并且会对wc -l
这些 x-es 进行计数。