给定一个目录“Centos1”,其中包含几个名为 Centos1.x、Centos1.y、Centos1.z 的文件,这些文件的内容中也包含“Centos1”。使用单个命令(使用 find、sed、perl -pie ),如何将所有出现的“Centos1”重命名为“Centos2” 以下是 Centos1 目录的内容。
Centos1.nvram Centos1-s005.vmdk Centos1.vmsd vmware-2.log
Centos1-s001.vmdk Centos1-s006.vmdk Centos1.vmx vmware.log
Centos1-s002.vmdk Centos1-s007.vmdk Centos1.vmxf
Centos1-s003.vmdk Centos1-s008.vmdk vmware-0.log
Centos1-s004.vmdk Centos1.vmdk vmware-1.log
注意:如果存在的话,我希望将所有文件中的“Centos1”替换为“Centos2”。
我切换到“Centos1”目录后运行了下面提到的命令
find . -type f -exec sed -i 's/Centos1/Centos2/g' {} +
但它没有帮助。有什么意见吗?
答案1
您可以使用 rename 命令进行重命名
rename Centos1 Centos2 *
或者如果你有 perl 重命名
rename 's/Centos1/Centos2' *
您的 find 命令应该将所有出现的 Centos1 更改为 Centos2,以便您可以将它们包装在一个简单的脚本中,使其成为单个命令。
#!/bin/bash
rename Centos1 Centos2 *
find . -type f -exec sed -i 's/Centos1/Centos2/g' {} +
答案2
您的答案是否真的只需要包含这些命令,或者您可以使用 bash 内置命令和文件通配符?
for file in Centos1*; do
sed -i 's/Centos1/Centos2/g' "$file"
mv "$file" "$(echo "$file" | sed 's/^Centos1/Centos2/')"
done
编辑:只使用 find/sed,并重命名文件内部
find ./ -type f -name Centos1* -exec sh -c 'sed -i "s/Centos1/Centos2/g" "$1"; mv "$1" "$(echo "$1" | sed "s/Centos1/Centos2/")"' X '{}' \;