如何使用 sed、perl 在给定目录中以特定模式重命名文件及其内容?

如何使用 sed、perl 在给定目录中以特定模式重命名文件及其内容?

给定一个目录“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 '{}' \;

相关内容