find -print0 | 内的命令执行xargs -0 sh -c

find -print0 | 内的命令执行xargs -0 sh -c

我用来find . -type f -print0 | xargs -0 sh -c执行这样的一系列命令

find . -type f \
exec grep -q `filter` \
-print0 | xargs -0 sh -c '
sed -i.bak s/this/that/g ${0}
git diff --no-index /path/to/${0}.bak /path/to/${0} >> my.patch
rm ${0}.bak
'

这看起来像搜索和替换,备份,补丁,删除备份,但是当我查看补丁文件时,大多数更改都不存在,所以我尝试了不同的方法

find . -type f \
exec grep -q `filter` \
-print0 | xargs -0 sed -i.bak s/this/that/g {} \;

之后,我将所有.bak文件移动到备份文件夹中,这一次,我可以看到有很多文件发生了变化,并且基于备份和源文件夹生成的补丁文件要大得多

我同意第二种方法,我只是想知道我在第一种方法中哪里做错了,为什么不是所有命令都在里面执行sh -c?谢谢!

答案1

xargs将尝试使用尽可能多的参数运行该命令,但您只使用其中之一。如下所示的内容将处理所有参数:

xargs -0 sh -c '
for i
do
sed -i.bak s/this/that/g "$i"
git diff --no-index /path/to/"$i".bak /path/to/"$i" >> my.patch
rm "$i".bak
done
' _ 

for i(或for i in "$@") 将循环遍历每个参数(除了$0),因此更容易使用类似_be的东西来代替并且根本$0不使用。$0

相关内容