sed -i
正在创建子目录中所有文件的备份,然后进行编辑(如预期的那样),但它实际上并不是在子目录中编辑文件。
$ mkdir -p a/b
$ echo "A" > a/a.txt
$ echo "B" > a/b/b.txt
现在我有两个文本文件,一个位于a
a
个文件中
$ sed -i.bac "1s/^/PREPENDED /" a/**/*.txt
为两者创建备份:
$ find a
a
a/a.txt
a/a.txt.bac
a/b
a/b/b.txt
a/b/b.txt.bac
仅编辑a.txt:
$ cat a/a.txt
PREPENDED A
$ cat a/b/b.txt
B
我正在使用ZSH(所以我有globstar支持),而且我在Mac上。
为什么会发生这种情况,我该如何解决?
答案 0 :(得分:4)
它正在发生,因为你的sed调用只有一行,恰好在a.txt
。如果你想让它为每个文件做,那么你需要多次调用sed。
for f in a/**/*.txt
do
sed ... "$f"
done
答案 1 :(得分:1)
由于您需要通过多个级别的目录进行下载,因此单独调用sed
是不够的。但是,使用find
,您可以在一行中完成您想要的任务。如果您不熟悉find ... -exec '{}' \;
,则需要花费几分钟startpage.com进行快速搜索。在您的情况下,以下调用运行良好:
find a -type f -name "*.txt" -exec sed -i.bac 's/^/PREPENDED /' '{}' \;
此处find
在目录a
及以下所有内容中搜索与-type f
匹配的任何文件(*.txt
),然后搜索每个文件(由'{}'
表示){ {1}}执行-exec
,最后提供转义sed -i.bac 's/^/PREPENDED /'
以指示\;
命令的结束。
结果:
-exec
正如已正确指出的那样,使用globstar set $ ls -1 a
b
a.txt
a.txt.bac
$ ls -1 a/b
b.txt
b.txt.bac
$ cat a/a.txt
PREPENDED A
$ cat a/b/b.txt
PREPENDED B
时,不必使用shopt -s globstar
,因为find
的以下调用就足够了:
sed