Назад | Перейти на главную страницу

Как использовать 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 '{}' \;