mv -i "$ {file}" "$ {file / -ID - / - SUBMIT_GO_ID -}"
Эта замена строки сообщает ему заменить
-ID-
, что не встречаются в именах ваших исходных файлов. Я думаю, вы хотите сказать это вместо этого:mv -i "${file}" "${file/ID_/SUBMIT_GO_ID_}"
Другая проблема, с которой вы можете столкнуться, заключается в том, что это функция
ksh93
, также доступная в Bash и Zsh, но не в чистых оболочках POSIX ]. Если вы используете#! / Bin / sh
в верхней части сценария, он будет работать либо под оболочкой POSIX, либо под интерпретатором оболочки Bourne до POSIX в некоторых системах , который этого не поймет.Если вы не можете использовать эту нестандартную функцию расширенных оболочек, существует множество альтернатив:
sed
Если вам нужно, чтобы этот сценарий был переносимым на все системы типов Unix, вы можете переключиться на
sed
для замены:mv -i "$file" "$(echo $file | sed -e 's/^ID_/SUBMIT_GO_ID_/')"
Это по-прежнему требует, по крайней мере, оболочки POSIX, из-за использования интерполяции команд стиля
$ ()
, но это проще «спросить», чем ожидать повсюду расширенную оболочку .Если бы ваш скрипт когда-либо запускался на каждой оболочке типа Bourne, вы могли бы переключиться на интерполяцию команд в стиле обратной кавычки, что может быть непросто, если у вас есть встроенные пробелы в именах файлов, но, похоже, это не так. случай здесь, в соответствии с вашим опубликованным примером. Таким образом, это должно быть эквивалентно предыдущему варианту для ваших целей:
mv -i "$file" `echo $file | sed -e s/^ID_/SUBMIT_GO_ID_/`
mmv
Другой вариант - установить
mmv
, программу, которая не устанавливается ни в одной из известных мне систем типа Unix. , но который обычно для него упакован в стандартный репозиторий пакетов.С помощьюmmv
вы можете заменить весь цикл сценария оболочки на$ mmv 'ID_*' 'SUBMIT_GO_ID_#1'
. Обратите внимание, что нет флага
-i
, потому чтоmmv
не поддерживает запрос каждого переименовать. Однако он предварительно проверяет все запланированные переименования и пытается обнаружить проблемы перед началом работы, поэтому он может быть достаточно близок для ваших целей.переименовать
Еще одним вариантом является команда
переименовать
, у которой есть по крайней мере три варианта в дикой природе. Есть две вилки сценария Perl Ларри Уолла с таким именем, один из которых может быть установлен в вашей системе уже как часть вашего дистрибутива Perl. Кроме того, существует вариантutil-linux
, который часто устанавливается вместо этой версии на машинах Linux или рядом с ней. Если у вас установлены оба, то, вероятно, Perl-версия называетсяprename
, чтобы избежать конфликта.Основное преимущество основанных на Perl состоит в том, что вы можете использовать регулярные выражения Perl , которые являются более мощными, чем выражения glob, поддерживаемые
mmv
или поддерживаемые регулярные выражения POSIX. Авторsed
. Однако в данном конкретном случае это не имеет большого значения, поскольку задача тривиальна:$ rename '^ID_' SUBMIT_GO_ID_ ID_EDMSCP_*.txt.pgp
Версия
util-linux
намного менее способна, потому что, хотя она называет свой первый параметр «выражение», она не является ни регулярным выражением POSIX, ни регулярным выражением Perl. Это даже не глобальное выражение: это просто буквальная строка.Но, как указано выше, это ограничение не мешает нам в данном конкретном случае:$ rename ID_ SUBMIT_GO_ID_ ID_EDMSCP_*.txt.pgp
Как и
mmv
,rename
не поддерживает-i
флаг.Обычная старая оболочка Борна
С учетом всего сказанного, ваш конкретный случай допускает гораздо более простое решение, потому что ваш входной шаблон появляется в конце выходного шаблона, поэтому вы можете делать все это с помощью переносимого синтаксиса оболочки Борна. :
for file in ID_EDMSCP_*.txt.pgp do mv -i "$file" SUBMIT_GO_"$file" done
Я оставил сложные альтернативы выше, потому что они часто необходимы, поскольку внутренних механизмов в языке оболочки не всегда достаточно.