考虑这个目录:
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.txt
和thing3.txt
,并且我对“事物 7”有一些想法,但它并不存在。要找到这些,我必须查找没有名为 Y 的同级文件 X。这该怎么做?
显然,我可以用 s 编写一个完整的脚本if
,但这有必要吗?
答案1
笔记
使用 bash
find
我可以查找以下内容(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
。它们并不相同,但在这种情况下并不重要。