xargs 和 < 和 > 到相同的文件

xargs 和 < 和 > 到相同的文件

我想git stripspace在每个构建(或预提交或手动)上运行我的所有源代码文件,以删除无关的空格,然后可能以标准方式格式化代码,

所以我想做一些类似的事情

git stripspace < project/code.m > project/code.m

所以我认为我应该能够使用find -execorxargs但看起来find不喜欢 'git stripspace' (可能是因为之间的空格或 < 或 >)并且我不知道如何传递相同的文件名,相同的参数,连续两次使用正确的重定向 (< >) 。

答案1

在读取文件之前,您正在破坏该文件。您需要使用临时文件或类似spongefrom 的实用程序更多实用程序

在这种情况下不能使用find -execor 。xargs您需要向 shell 传递一个包含命令和文件名的参数。xargsfind期望文件名标记(用文件名替换)是一个独立的参数。您可以使用循环代替。

使用临时文件:

find | while read file ; do
    git stripspace < "$file" > tempfile
    mv -f tempfile "$file"
done

sponge

find | while read file ; do
    git stripspace < "$file" | sponge "$file"
done

答案2

您可以在 Ex 模式下使用 Vim:

ex -sc '%!git stripspace' -cx project/code.m
  1. %选择所有行

  2. !运行命令

  3. x保存并关闭

相关内容