Учитывая каталог «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 '{}' \;