为什么 find 命令不将所有文件作为 -exec 参数的输入传递?

问题描述 投票:0回答:1

目录下有所有文件和符号链接:

./02.tdf/IP_B186.tdf
./02.tdf/In_B186.tdf
./03.bed/IP_B186_vs_In_B186_peaks.xls.promoter_peak.bed
./03.bed/IP_B186_vs_In_B186_peaks.xls.bed
./01.genome/Harukei3_v1.41.fa
./01.genome/Harukei3_v1.41.gene.bed
./md5.txt

当我跑步时

find . -type f -o -type l -exec md5sum {} +  | sort > md5.txt
我会得到:

cat md5.txt
331a1bebdaf8b09fbdb6468b9c53bac3  ./01.genome/Harukei3_v1.41.fa
6354c1dfb5b0aff9620712ec17c271e3  ./01.genome/Harukei3_v1.41.gene.bed

当我跑步时

find . -type f -o -type l | while read i; do md5sum $i >> md5.txt; done
我会得到:

cat md5.txt
d9eb8d2ad4f0c03ca1dc9628e3562f01  ./02.tdf/IP_B186.tdf
c72eda337f2d75301baf125d6d64a5bc  ./02.tdf/In_B186.tdf
3ea65045235ed51efcc88af49d126a60  ./03.bed/IP_B186_vs_In_B186_peaks.xls.promoter_peak.bed
954484488dce3f5f18b7c06f6693f223  ./03.bed/IP_B186_vs_In_B186_peaks.xls.bed
331a1bebdaf8b09fbdb6468b9c53bac3  ./01.genome/Harukei3_v1.41.fa
6354c1dfb5b0aff9620712ec17c271e3  ./01.genome/Harukei3_v1.41.gene.bed

第二个结果就是我想要的,我想知道为什么第一个脚本给出如此奇怪的输出。 有人可以帮助我吗?非常感谢。

我也尝试了

find . -type f -o -type l -exec md5sum {} \;  | sort > md5.txt
,但它给出了我不想要的相同输出。

linux shell find
1个回答
0
投票

find
的标准(格式化我的):

可以使用以下运算符组合原色(按优先级递减的顺序):

  • (
    表情
    )
    • 如果表达式为真,则为真。
  • !
    表情
    • 否定原初;一元 NOT 运算符。
  • 表达式 [
    -a
    ] 表达式
    • 初选的结合; AND 运算符由两个原色并置隐含,或由可选的
      -a
      运算符明确表示。如果第一个表达式为 false,则不应计算第二个表达式。
  • 表情
    -o
    表情
    • 初选交替;或运算符。如果第一个表达式为 true,则不应计算第二个表达式。

如果没有表达式,则应使用

-print
作为表达式。否则,如果给定表达式不包含任何原色
-exec
-ok
-print
,则给定表达式应有效替换为:

(
给定_表达式
)
-print


find . -type f -o -type l -exec md5sum {} +

其形式为 表达式

-o
表达式,其中表达式:

  • -type f
  • -type l -exec md5sum {} +

只有第二个产生输出。

find . -type f -o -type l

这也有形式 表达式

-o
*表达式,带有表达式:

  • -type f
  • -type l

都没有明确地产生输出。然而,上面的最终规则适用,并且隐含的命令是:

find \( -type f -o -type l \) -print


正如 @jqurious 在评论中指出的那样,对于第一个命令,您可能应该使用括号:

find \( -type f -o -type l \) -exec md5sum {} +
© www.soinside.com 2019 - 2024. All rights reserved.