在整个 Linux 文件系统中查找并替换 file/folder 名称和内容

Find and replace file/folder names and contents in whole Linux file system

我有一个 Linux (Ubuntu) 服务器,我在上面托管了一个网站。我正在更改我的域名,比方说从 xxxxx.xxyyyyy.yy.

我想要的是在整个文件系统的所有文件和文件夹名称以及所有文件内容中找到 xxxxx.xx 并将其替换为 yyyyy.yy 以反映此更改。

我不认为这个问题已被完整地提出,但如果我错过了它,请指出正确的方向。谢谢。

您可以使用 GNU find 和一些 bash 字符串操作来进行实际的文件重命名。

*xxxx.xx* 是一个匹配 files/folders 的全局模式,在他们的名字的任何地方都有这个。

强烈建议 NOT 到 运行 立即重命名,但 运行 与 echo 一次以查看文件是否正确正确列出。我提供了两种不同的命令,一种用于重命名文件,另一种用于文件夹,因为重命名文件夹需要几个额外的选项来避免递归文件重命名。

重命名文件夹:-

find . -depth -type d -name "*xxxx.xx*" -execdir sh -c 'x=; y="${x/xxxx.xx/yyyy.yy}"; mv -v "$x" "$y"' sh {} \;

对于文件:-

find . -type f -name "*xxxx.xx*" -exec sh -c 'x=; y="${x/xxxx.xx/yyyy.yy}"; mv -v "$x" "$y"' sh {} \;

立即执行 NOT 运行 命令,只需 运行 下面的命令,看看原来的 file/folder 和重新-named file/folder 有你想要的专有名称。

find . -type f -name "*xxxx.xx*" -exec sh -c 'x=; y="${x/xxxx.xx/yyyy.yy}"; echo "$x" "$y"' sh {} \;

(和)

find . -depth -type d -name "*xxxx.xx*" -execdir sh -c 'x=; y="${x/xxxx.xx/yyyy.yy}"; echo "$x" "$y"' sh {} \;

由于您还想更改文件的内容,添加一个额外的 sed 就地文件重命名为

find . -type f -name "*xxxx.xx*" -exec sh -c 'x=; y="${x/xxxx.xx/yyyy.yy}"; mv -v "$x" "$y"; sed -i 's/xxxx.xx/yyyy.yy/g' "$y" ' sh {} \;