如何使用find将字符串附加到目录中的每个文件

Car*_*han 5 bash exec find

我正在尝试将一个固定字符串附加到文件夹(及其子文件夹)中的每个文件,同时跳过.git目录.

我希望这样的东西能起作用

 find . -type f ! -path "./.git/*" -exec "echo \"hello world\" >> {}" \;
Run Code Online (Sandbox Code Playgroud)

如果我使用额外的echo运行它,它会生成看起来正确的命令

bash> find . -type f ! -path "./.git/*" -exec echo "echo \"hello world\" >> {}" \;
echo "hello world" >> ./foo.txt
echo "hello world" >> ./bar.txt
...
Run Code Online (Sandbox Code Playgroud)

当我直接从shell运行它们时,那​​些命令做我想要的但是当我从find运行它时我得到这个:

bash> find . -type f ! -path "./.git/*" -exec "echo \"hello world\" >> {}" \;
find: echo "hello world" >> ./foo.txt: No such file or directory
find: echo "hello world" >> ./bar.txt: No such file or directory
...
Run Code Online (Sandbox Code Playgroud)

但是那些文件确实存在,因为当我列出目录时,我得到了这个:

bash> ls
bar.txt  baz.txt  foo.txt  subfolder/
Run Code Online (Sandbox Code Playgroud)

我想我没有引用我需要的东西,但我已经尝试了所有我能想到的东西(双引号和单引号,转义而不是逃避内部引号等等).

有人可以解释我的命令有什么问题,以及如何实现向文件添加固定字符串?

dev*_*ull 13

您需要指示shell执行此操作:

find . -type f ! -path "./.git/*" -exec sh -c "echo hello world >> {}" \;
Run Code Online (Sandbox Code Playgroud)

  • 太棒了,有效。您能解释一下原始命令的问题是什么吗?它似乎正在构建正确的命令字符串,但由于某种原因它找不到文件。 (2认同)