根据同级文件查找文件

根据同级文件查找文件

考虑这个目录:

thingsToThinkAbout/
    thing1.txt
    thing2.txt
    thing2.txt.thoughts.txt
    thing3.txt
    thing7.txt.thoughts.txt

使用 bash,find我可以查找事物 ( find . -name "thing*.txt")、想法 ( find . -name "thing*.txt.thoughts.txt") 或两者 ( find . -name "*.txt"),但我可以使用命令基于兄弟姐妹也一样?

在我的示例中,我没有考虑thing1.txtthing3.txt,并且我对“事物 7”有一些想法,但它并不存在。要找到这些,我必须查找没有名为 Y 的同级文件 X。这该怎么做?

显然,我可以用 s 编写一个完整的脚本if,但这有必要吗?

答案1

笔记

使用 bashfind我可以查找以下内容(find . -name "thing*.txt"

你试过这个吗?这也会找到想法。以下find调用会排除它们:

find . -name "thing*.txt" ! -name "*.thoughts.txt"

回答

要查找没有思想的东西,您可以使用-exec(或-execdir) 作为测试。如果调用的命令返回 的退出状态,则成功0。在这种情况下,命令是test

find . -name "thing*.txt" ! -name "*.thoughts.txt" -exec test ! -e "{}.thoughts.txt" \; -print

如您所见,向名称添加字符串 ( "{}.thoughts.txt") 非常容易。要查找没有事物的想法,您基本上可以做同样的事情,但您需要删除一些字符串;这并不容易。额外的 shell 可以做到这一点:

find . -name "thing*.txt.thoughts.txt" -exec sh -c 'test ! -e "${1%.thoughts.txt}"' sh {} \; -print

${1%.thoughts.txt}返回$1.thoughts.txt从最后删除。我们检查此文件是否不存在。

注意find … -exec test …执行test可执行文件,而sh -c 'test …'使用 的test内置命令sh。它们并不相同,但在这种情况下并不重要。

相关内容