Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何直接用';未扩展';(空格到制表符的转换)?_Linux_Unix_Redirect_Overwrite - Fatal编程技术网

Linux 如何直接用';未扩展';(空格到制表符的转换)?

Linux 如何直接用';未扩展';(空格到制表符的转换)?,linux,unix,redirect,overwrite,Linux,Unix,Redirect,Overwrite,我试着用一些类似于 unexpand -t 4 *.php 但我不确定如何编写此命令来执行我想要的操作 奇怪的是 unexpand -t 4 file.php > file.php 给我一个空文件。(即不使用任何内容覆盖file.php) 我可以指定多个文件,但不知道如何覆盖每个文件 我可以使用我的IDE,但是大约有67000个实例需要替换200多个文件,这需要一段时间 我希望我的问题的答案将是标准的unix费用,但我仍在学习…您很少可以使用输出重定向来替换输入。替换为内部支持它的命令

我试着用一些类似于

unexpand -t 4 *.php
但我不确定如何编写此命令来执行我想要的操作

奇怪的是

unexpand -t 4 file.php > file.php
给我一个空文件。(即不使用任何内容覆盖file.php)

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

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


我希望我的问题的答案将是标准的unix费用,但我仍在学习…

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

  • 对foo执行操作,创建foo.tmp
  • 将foo.tmp移动(重命名)为foo,覆盖原始
  • 这会很快。这将需要更多的磁盘空间,但如果在继续下一个文件之前执行这两个步骤,则只需要与最大的单个文件一样多的额外空间,这应该不是问题

    草图脚本:

    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
    文件进行此更改;如果愿意,可以省略
    find
    中的
    iname
    子句,或者使用不同的参数以不同的方式撒网

    我的版本将文件名用引号括起来,但在匹配文件路径中出现的“有趣”目录名周围不使用引号

    若要在一行上完成所有操作,请在第1、3和4行之后添加半成品


    这有潜在的危险,所以在运行命令之前进行备份或使用git。如果您使用的是git,您可以验证是否只有空格被更改为
    git diff-w

    出于偏执狂的考虑,我倾向于这样做:unexpand-t4“$a”>“$a”-notab&&mv“$a”-notab”$a(这对于几个额外的字符来说是非常安全的)。还有,这些引语真的是个好主意。谢谢你们,非常有用。有没有一种简单的方法可以使文件匹配递归?使文件匹配递归:尝试
    以获得一个in$(find.)
    。这将使后续命令的逻辑复杂化,因为
    $a
    现在将包括目录分隔符,不能用引号整体包装。您可能必须在循环中使用
    dirname
    basename
    来组合源文件名和目标文件名。但是,通过使用
    find
    ,您还可以获得强大的过滤选项。