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

hyrbngr7  于 2023-10-16  发布在  Linux
关注(0)|答案(1)|浏览(166)

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

./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,但它给出了我不想要的相同输出。

42fyovps

42fyovps1#

find状态的标准(格式化我的):
可以使用以下运算符(按优先级降序排列)组合主元素:

  • (表达式)
  • 如果表达式为true,则为True。
  • !表达式
  • 一个主要的否定;一元非运算符。
  • 表达式[-a]表达式
  • 原色的合取; AND运算符通过两个原色的并置来暗示,或者通过可选的-a运算符来明确。如果第一个表达式为假,则不应计算第二个表达式。
  • 表达式-o表达式
  • 原色的交替;或操作员。如果第一个表达式为真,则不应计算第二个表达式。

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

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

它的形式为 expression-oexpression,表达式为:

  • -type f
  • -type l -exec md5sum {} +
  • (形式:expression-aexpression

只有第二个产生输出。

find . -type f -o -type l

它也有 expression-oexpression 的形式,表达式为:

  • -type f
  • -type l

这两个表达式都不显式地产生输出。然而,上面的最后一条规则适用,隐含的命令是:

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

正如@jqurious在评论中指出的那样,为了得到你想要的结果,你应该使用括号:

find \( -type f -o -type l \) -exec md5sum {} +

相关问题