我正在尝试使用类似的东西
unexpand -t 4 *.php
但我不确定如何编写这个命令来做我想做的事。
奇怪的是,
unexpand -t 4 file.php > file.php
给了我一个空文件。(即什么都没有覆盖file.php)
我可以指定多个文件,但不知道如何覆盖每个文件。
我可以使用我的 IDE,但是有大约 67000 个实例要替换超过 200 个文件,这需要一段时间。
我希望我的问题的答案将是标准的 unix 票价,但我仍在学习......
您很少可以使用输出重定向来替换输入。替换适用于内部支持它的命令(因为它们随后自己执行基本步骤)。从 shell 级别来看,分两步工作要好得多,如下所示:
这会很快。这将需要更多的磁盘空间,但是如果您在继续下一个文件之前执行这两个步骤,您将只需要与最大的单个文件一样多的额外空间,这应该不是问题。
草图脚本:
for a in *.php
do
unexpand -t 4 $a >$a-notab
mv $a-notab $a
done
你可以做得更好(错误检查等),但这是基本大纲。
这是我使用的命令:
for p in $(find . -iname "*.js")
do
unexpand -t 4 $(dirname $p)/"$(basename $p)" > $(dirname $p)/"$(basename $p)-tab"
mv $(dirname $p)/"$(basename $p)-tab" $(dirname $p)/"$(basename $p)"
done
此版本更改以当前工作目录为根的目录层次结构中的所有文件。
就我而言,我只想对.js
文件进行此更改;如果您愿意,您可以省略该iname
子句find
,或者使用不同的参数来以不同的方式投放您的网络。
我的版本将文件名用引号括起来,但它没有在匹配文件路径中出现的“有趣”目录名周围使用引号。
要将它们全部放在一行上,请在第 1、3 和 4 行之后添加一个半。
这有潜在的危险,因此请在运行命令之前进行备份或使用 git。如果你使用 git,你可以验证只有空格被git diff -w
.