【问题标题】:How to change all occurrences of a word in all files in a directory如何更改目录中所有文件中所有出现的单词
【发布时间】:2012-02-12 21:48:04
【问题描述】:

我正在创建一个User 类,其中一个方法是get_privileges();

在敲了几个小时的键盘后,我终于发现我继承这个特定数据库的前一个编码员将“privileges”这个词拼成了“privelages”在 MySQL 数据库中,因此在访问这些“privelages”的数百个文件中的任何地方都是这样拼写的。

在 Linux (Ubuntu Server) 中是否有一种方法可以让我遍历 /var/www 文件夹中的每个位置并将“privelages”替换为“特权”,这样我就不必处理这个错字和代码?

【问题讨论】:

    标签: linux ubuntu replace


    【解决方案1】:

    我通常使用这个简短的脚本,它将重命名所有文件和所有目录名和文件名中的字符串。要使用它,您可以将下面的文本复制到一个名为replace_string 的文件中,运行sudo chmod u+x replace_string,然后将其移动到您的sudo mv replace_string /usr/local/bin 文件夹中,以便能够在任何目录中执行它。

    注意:这只适用于 linux(在 ubuntu 上测试),在 MacOS 上失败。还要小心这一点,因为它会弄乱 git 文件之类的东西。我也没有在二进制文件上测试过。

    #!/usr/bin/env bash
    
    # This will replace all instances of a string in folder names, filenames,
    # and within files.  Sometimes you have to run it twice, if directory names change.
    
    
    # Example usage:
    # replace_string apple banana
    
    echo $1
    echo $2
    
    find ./ -type f -exec sed -i -e "s/$1/$2/g" {} \;  # rename within files
    find ./ -type d -exec rename "s/$1/$2/g" {} \;    # rename directories
    find ./ -type f -exec rename "s/$1/$2/g" {} \;  # rename files
    

    【讨论】:

      【解决方案2】:

      考虑子目录的变体(未经测试):

      find /var/www -type f -exec sed -i 's/privelages/privileges/g' {} \;
      

      这将find/var/www 下的所有文件(不是目录,由-type f 指定),并在它找到的每个文件上执行sed 命令以将“privelages”替换为“privileges”。

      【讨论】:

      • 感谢 - 使用 BSD sed 的 Mac 用户。您需要为 -i 参数添加扩展名。像这样:sed -i "" 's/prive...
      • 如果您只想在包含拼写错误的文件上运行sed(如果您的项目包含数千个文件,您会想要这样做),您可以执行grep -l -r "privelages" /var/www | xargs -I "@" sed -i 's/privelages/privileges/g' @
      • 使用 grep 然后使用 sed 可能比仅使用 sed 性能更差,因为这意味着打开和读取每个文件两次
      • 当心在具有 .git 文件夹的目录中执行此操作。这可能会破坏内容!
      • 我知道这个问题被标记为 linux 但对于 Mac,我必须在 sed -i 之后添加 -e
      【解决方案3】:

      看看这个:http://www.cyberciti.biz/faq/unix-linux-replace-string-words-in-many-files/

      cd /var/www
      sed -i 's/privelages/privileges/g' *
      

      【讨论】:

      • 如果你想递归子目录,你需要添加一个find,或者使用一个shell,它允许你glob所有子目录中的所有文件(提示:**/*在某些shell中这样做) .这是一个常见问题解答;搜索类似的问题。同情你不得不应付一个文盲的前任......
      猜你喜欢
      • 2012-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多