我不太理解man find
给出的示例,有人能给我一些示例和解释吗?我可以在其中结合使用正则表达式吗?
更详细的问题如下:
编写一个名为changeall
的shell脚本,其接口类似于changeall [-r|-R] "string1" "string2"
。它将查找所有后缀为.h
、.C
、.cc
或.cpp
的文件,并将所有string1
的出现替换为string2
。选项-r
表示仅在当前目录下或包括子目录中查找。
注意:
- 对于非递归情况,不允许使用
ls
,只能使用find
和sed
。 - 我尝试过
find -depth
,但它不被支持。这就是为什么我想知道-prune
是否有帮助,但我不理解来自man find
的示例。
编辑2:我在做作业,我没有详细说明问题,因为我想自己完成它。由于我已经完成并提交了作业,现在我可以陈述整个问题。此外,我设法在不使用-prune
的情况下完成了任务,但仍想了解它。
find $dir -type d -exec sh -c 'test -f $1/DONTBACKUP' sh {} \; -prune -o morestuff
我们从$dir
开始,找到的任何目录都会被测试是否包含名为DONTBACKUP
的文件。如果存在(即“-exec”的退出状态为0),则跳过该目录,否则继续进行morestuff
。 - plijnzaadfind . -name "*.c" -o -path "./build" -prune
。因此,它会返回一堆不在./build/
和./build/
中的*.c
文件。 - Puck-print
操作来获得正确的行为。你的子句与答案中推荐的方式相反。通常我会写出你想要做的事情:find . -path "./build" -prune -o -name "*.c" -print
。然而,如果你更喜欢修剪后的内容在最后,那也可以,但你需要在-o
之前插入打印操作:find . -name "*.c" -print -o -path "./build" -prune
。有关更多详细信息,请参见“重要说明”#1。 - Laurence Gonsalves\! -path
更容易理解,并且适用于按路径名修剪的常见情况。但是,-prune
更加通用,因为它可以基于任何谓词进行修剪,而不仅仅是路径。 - Laurence Gonsalves