Linux

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

  • July 27, 2011

給定一個目錄“Centos1”,其中包含幾個名為 Centos1.x、Centos1.y、Centos1.z 的文件,這些文件的內容中也有“Centos1”。使用單個命令(使用 find、sed、perl -pie )我怎樣才能將它們重命名為“Centos2”,因為“Centos1”的所有出現這裡是 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' {} +

但這沒有幫助。任何輸入?

您可以使用 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' {} +

您的答案是否真的只需要包含這些命令,或者您可以使用 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 '{}' \;

引用自:https://serverfault.com/questions/294552