Проверять с помощью awk на совпадения в файле журнала с помощью awk.

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

Я оставил сложные альтернативы выше, потому что они часто необходимы, поскольку внутренних механизмов в языке оболочки не всегда достаточно.

3
09.06.2015, 13:49
0 ответов

Теги

Похожие вопросы