Linux
如何使用 sed、perl 在給定目錄中以特定模式重命名文件及其內容?
給定一個目錄“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 '{}' \;