У меня есть коллекция файлов, соответствующих шаблону, например «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.
shell-script
sed
file-management
rename
Жиль "ТАК - перестань быть злым"
источник
источник
$OLD_NO
и$NEW_NO
не будет расширяться.newname=$(echo $name | tr $OLD_NO $NEW_NO)
Ответы:
Использование sed здесь вносит больше сложности, чем оно того стоит. Используйте встроенные в оболочку функции управления текстом. Например,
${name#assignment02}
удаляет префиксassignment02
из$name
.Двойные кавычки не нужны, если вы уверены, что имена файлов не содержат специальных символов оболочки.
Если у вас есть zsh, его
zmv
функция полезна для такого рода переименований.источник
Ты уже думаешь слишком сложным
«rename» заменяет первый аргумент («02») вторым аргументом («03») в имени всех файлов, указанных в arg3 или после (* 02 *)
источник
rename
с этим синтаксисом является утилитой Linux, недоступной в OSX (и даже недоступной под этим именем в большинстве установок Debian и Ubuntu).Другой подход:
В долгосрочной перспективе: попробуйте переименовать
источник
Один из способов сделать это:
источник
ls
. И создание сценария оболочки - верный способ выстрелить себе в голову. Вопрос Vault Boy содержит разумный подход со стороны оболочки, просто отсутствует правильное заклинание sed и некоторые цитаты.