我不太明白"男人发现"给出的例子,有人能给我一些例子和解释吗?我可以在其中组合正则表达式吗?
更详细的问题是这样的:写一个shell脚本,changeall,它有一个像"changeall [-r | -R]"string1""string2"这样的接口.它将找到后缀为.h,.C的所有文件,.cc或.cpp并将所有出现的"string1"更改为"string2".- r是仅保留当前目录或包含subdir的选项.注意:1)对于非递归情况,不允许"ls" ,我们只能使用'find'和'sed'.2)我试过'find -depth'但它不受支持.这就是为什么我想知道'-prune'是否可以帮助,但是不明白'男人发现'.
EDIT2:我正在做作业,我没有详细提问,因为我想自己完成.既然我已经完成并把它交给我,现在我可以陈述整个问题.此外,我设法在不使用-prune的情况下完成了作业,但无论如何都想学习它.
我正在尝试使用shell脚本获取目录的内容.
我的脚本是:
for entry in `ls $search_dir`; do
echo $entry
done
Run Code Online (Sandbox Code Playgroud)
哪里$search_dir是相对路径.但是,它$search_dir包含许多名称中带有空格的文件.在这种情况下,此脚本不会按预期运行.
我知道我可以使用for entry in *,但这只适用于我当前的目录.
我知道我可以更改到该目录,for entry in *然后使用然后更改回来,但我的特殊情况阻止我这样做.
我有两个相对路径$search_dir和$work_dir,和我有两个同时工作,阅读他们创建/删除在他们的文件等.
那我现在该怎么办?
PS:我用bash.
列出我不在的文件夹的内容时遇到问题,同时排除实际的文件夹名称本身.
例如:
root@vps [~]# find ~/test -type d
/root/test
/root/test/test1
Run Code Online (Sandbox Code Playgroud)
但是我希望它只显示/ test1,作为示例.
思考?
编辑:命令替换对于令人惊讶的行为不是必需的,尽管它是最常见的用例.同样的问题适用于echo "'!b'"
b=a
# Enable history substitution.
# This option is on by default on interactive shells.
set -H
echo '!b'
# Output: '!b'
# OK. Escaped by single quotes.
echo $(echo '!b')
# Output: '!b'
# OK. Escaped by single quotes.
echo "$(echo '$b')"
# Output: '$b'
# OK. Escaped by single quotes.
echo "$(echo '!b')"
# Output: history expands
# BAD!! WHY??
Run Code Online (Sandbox Code Playgroud)
!什么?echo "$(echo '$b')"呢?!和之间有什么区别$?echo $(echo …我正在编写一个脚本,需要从目录中删除所有内容,除了两个目录,mysql和temp.
我试过这个:
ls * | grep -v mysql | grep -v temp | xargs rm -rf
Run Code Online (Sandbox Code Playgroud)
但这也保留了所有名称中包含mysql的文件,我不需要.它也不会删除任何其他目录.
有任何想法吗?
如何使用 find 排除当前工作目录 (CWD)?
考虑我当前的工作目录包含以下目录 ( ls .):
a b c d e f g
Run Code Online (Sandbox Code Playgroud)
查找命令:find . -maxDepth 1 -type d将返回:
.
./a
./b
./c
./d
./e
./f
./g
Run Code Online (Sandbox Code Playgroud)
我尝试了这里的答案(如何在 find .command 中排除目录):find . -maxdepth 1 -type d -path . -prune -false
虽然我可以使用,但ls我很好奇如何使用find.
因此命令的预期输出find应该类似于以下ls .输出:
./a
./b
./c
./d
./e
./f
./g
Run Code Online (Sandbox Code Playgroud)