我有一个 Linux (Ubuntu) 服务器,我在上面托管一个网站。我正在更改我的域名,例如 xxxxx.xx
至yyyyy.yy
.
我想要的是一个查找 xxxxx.xx
并将其替换为 yyyyy.yy
在整个文件系统的所有文件和文件夹名称以及所有文件内容中以反射(reflect)此更改。
我不认为这个问题已被完整地提出,但如果我错过了,请为我指出正确的方向。谢谢。
最佳答案
您可以使用 GNU find
和一些 bash
字符串操作来进行实际的文件重命名。
*xxxx.xx*
是一个 glob 模式,用于匹配名称中任意位置包含此内容的文件/文件夹。
强烈建议不要立即运行重命名,而是使用echo
运行一次以查看文件是否正确列出。我提供了两种不同的命令,一种用于重命名文件,另一种用于文件夹,因为重命名文件夹需要几个额外的选项来避免递归文件重命名。
用于重命名文件夹:-
find . -depth -type d -name "*xxxx.xx*" -execdir sh -c 'x=$1; y="${x/xxxx.xx/yyyy.yy}"; mv -v "$x" "$y"' sh {} \;
对于文件:-
find . -type f -name "*xxxx.xx*" -exec sh -c 'x=$1; y="${x/xxxx.xx/yyyy.yy}"; mv -v "$x" "$y"' sh {} \;
不要立即运行命令,只需运行以下命令,看看原始文件/文件夹和重命名的文件/文件夹是否具有您想要的正确名称。
find . -type f -name "*xxxx.xx*" -exec sh -c 'x=$1; y="${x/xxxx.xx/yyyy.yy}"; echo "$x" "$y"' sh {} \;
(和)
find . -depth -type d -name "*xxxx.xx*" -execdir sh -c 'x=$1; y="${x/xxxx.xx/yyyy.yy}"; echo "$x" "$y"' sh {} \;
由于您还想更改文件的内容,因此添加一个额外的 sed
就地文件重命名为
find . -type f -name "*xxxx.xx*" -exec sh -c 'x=$1; y="${x/xxxx.xx/yyyy.yy}"; mv -v "$x" "$y"; sed -i 's/xxxx.xx/yyyy.yy/g' "$y" ' sh {} \;
关于linux - 在整个 Linux 文件系统中查找并替换文件/文件夹名称和内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41387042/