8

我正在尝试使用类似的东西

unexpand -t 4 *.php

但我不确定如何编写这个命令来做我想做的事。

奇怪的是,

unexpand -t 4 file.php > file.php

给了我一个空文件。(即什么都没有覆盖file.php)

我可以指定多个文件,但不知道如何覆盖每个文件。

我可以使用我的 IDE,但是有大约 67000 个实例要替换超过 200 个文件,这需要一段时间。

我希望我的问题的答案将是标准的 unix 票价,但我仍在学习......

4

2 回答 2

12

您很少可以使用输出重定向来替换输入。替换适用于内部支持它的命令(因为它们随后自己执行基本步骤)。从 shell 级别来看,分两步工作要好得多,如下所示:

  1. 对 foo 进行操作,创建 foo.tmp
  2. 将 foo.tmp 移动(重命名)为 foo,覆盖原来的

这会很快。这将需要更多的磁盘空间,但是如果您在继续下一个文件之前执行这两个步骤,您将只需要与最大的单个文件一样多的额外空间,这应该不是问题。

草图脚本:

for a in *.php
do
  unexpand -t 4 $a >$a-notab
  mv $a-notab $a
done

你可以做得更好(错误检查等),但这是基本大纲。

于 2009-07-07T11:35:00.063 回答
2

这是我使用的命令:

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.

于 2018-08-29T19:05:21.487 回答