Копировать / переименовать несколько файлов с помощью регулярного выражения (сценарий оболочки)

8

У меня есть коллекция файлов, соответствующих шаблону, например «assignment02.cc», «assignment02.h», «assignment02.txt» и т. Д. Я хотел бы скопировать / переименовать эти файлы в «assignment03.cc», «assignment03». h ',' assignment03.txt 'и т. д.

Я подозреваю, что это должно быть прямо с использованием сценария оболочки и sed. Пока что у меня есть:

OLD_NO=$1
NEW_NO=$2

echo "Moving from $OLD_NO to $NEW_NO"

for name in assignment$OLD_NO.* ; do
  newname=$(echo $name | sed 's/\(.*\)$OLD_NO\(.*\)/\1xx$NEW_NO\2/')
  echo "$name -> $newname"
  # mv -v $name $newname
done

К сожалению, способ, которым я вызываю sed, всегда возвращает входную строку $nameи фактически не выполняет регулярное выражение find / replace.

Примечание: при просмотре в Интернете есть renameкоманда, которая имеет эту функцию, но ее нет на моем MacBook.

Жиль "ТАК - перестань быть злым"
источник
Измените одинарные кавычки на двойные. Если у вас есть одинарные кавычки вокруг команды sed, то $OLD_NOи $NEW_NOне будет расширяться.
Микель
newname=$(echo $name | tr $OLD_NO $NEW_NO)
Низам Мохамед,

Ответы:

5

Использование sed здесь вносит больше сложности, чем оно того стоит. Используйте встроенные в оболочку функции управления текстом. Например, ${name#assignment02}удаляет префикс assignment02из $name.

for name in assignment02.*; do
  mv "$name" "assignment03${name#assignment02}"
done

Двойные кавычки не нужны, если вы уверены, что имена файлов не содержат специальных символов оболочки.

Если у вас есть zsh, его zmvфункция полезна для такого рода переименований.

autoload zmv
zmv '(assignment)02.(*)' '${1}03.$2'
Жиль "ТАК - перестань быть злым"
источник
3

Ты уже думаешь слишком сложным

rename 02 03 *02*

«rename» заменяет первый аргумент («02») вторым аргументом («03») в имени всех файлов, указанных в arg3 или после (* 02 *)

Патрик
источник
Команда renameс этим синтаксисом является утилитой Linux, недоступной в OSX (и даже недоступной под этим именем в большинстве установок Debian и Ubuntu).
Жиль "ТАК - перестань быть злым"
Ах, не знал, что вы были на OSX, облом
Патрик
Rename - это Perl-скрипт, поэтому он, вероятно, будет работать на OS X. Найти его можно здесь с помощью google: tips.webdesign10.com/files/rename.pl.txt
azzid
0

Другой подход:

for ext in {cc,h,txt}
do 
  echo mv assignment02.$ext assignment03.$ext
done

В долгосрочной перспективе: попробуйте переименовать

Пользователь неизвестен
источник
-1

Один из способов сделать это:

ls -1  | sed "s/\(.*\)\..*$/mv '&' '\1.txt'/" | sh
mazianni
источник
2
Не анализируйте выводls . И создание сценария оболочки - верный способ выстрелить себе в голову. Вопрос Vault Boy содержит разумный подход со стороны оболочки, просто отсутствует правильное заклинание sed и некоторые цитаты.
Жиль "ТАК - перестань быть злым"