Как переименовать много файлов в оболочке bash?

Как переименовать много файлов в оболочке bash?

Извините за вопрос. Я много искал в интернете, но не смог найти ответ, который бы сработал (хотя было много предложений).

Итак, я хочу переименовать МНОГО файлов. Писать все имена файлов не вариант. Файлы называются так:

HAUPT_SIA_039.MR.NEUROPSYCHOLOGIE_LOGIN.0003.0001.2014.03.28.14.49.59.511530.47117493.IMA

начало всегда одинаковое, а также .IMA Длинный номер не одинаков для всех файлов. Мне нужно изменить 039 на 036_2 для всех файлов. Остальное должно остаться прежним.

Я попробовал все следующие команды (плюс несколько других), но это ничего не дало:

cd my_directory

rename 's/\w039_2\w/\w036_2\w/g' * 

rename ?039_2? ?036_2? ?0_39_2?.IMA

rename 's/?039_2?/?036_2?/' ?039_2?.IMA

rename 's/\w039_2\w/\w036_2\w/' ?039_2?.IMA

Perl установлен в системе Linux (но я не уверен, как его назвать... потому что если я открываю терминал Perl, он ничего не делает).

Вы можете помочь мне?

решение1

for file in * ; do mv $file $(echo $file | sed 's/_039/_036_2') ; done

Объяснение:

for file in * ; do _______ ; done

bash выполнит расширение оболочки *для перечисления каждого файла в рабочем каталоге. Для каждого из этих файлов эта структура команды установит переменную, fileравную имени файла, и запустит команду между ; doи; done

mv $file _______

mvэто традиционный способ переименования файлов в unix/linux. Он переименует fileв_______

echo $file | sed 's/_039/_036_2'

echo $file | sedпросто отправит " file" на стандартный ввод sed, где sedзаменит "_036_2" на "_039"

Итого: для каждого файла в текущем каталоге переименовать файл, заменив «_036_2» на «_039».

решение2

Ваше регулярное выражение некорректно, вот то, которое должно работать.

rename 's/HAUPT_SIA_039[.]\(.*\)/HAUPT_SIA_039_2.\1/g' HAUPT_SIA*.IMA

Вы используете правильный инструмент, нет необходимости в поиске, если у вас нет подкаталогов.


Примечание о регулярных выражениях в sed и переименовании.

Формат следующий sXsearch_patternXreplace_patternXoptions( Xможет быть любым символом). searchPattern — это то, что вы хотите заменить, то, что уже существует, а не то, чем вы заменяете.

-wпредставляет собой одно слово и может быть только в search_pattern.

решение3

найти . -имя "*039*" | переименовать 's/039/036_2/g'

решение4

Перебрать все файлы с префиксом «HAUPT_...», затем переименовать с помощью shell substring, ${f:15}возвращающего строку из 15-го символа имени файла, добавленного к HAUPT_...префиксу.

for f in "HAUPT_SIA_039*" ; do  mv $f "HAUPT_SIA_036_2${f:15}"; done

РЕДАКТИРОВАТЬ - Похоже, что каталог со всеми файлами также содержит подкаталоги с тем же префиксом HAUPT.... В этом случае используйте команду, findчтобы сначала отфильтровать только файлы, а не каталоги.

find . -type f -name "HAUPT_SIA_039*" | while read f; do mv $f "HAUPT_SIA_036_2${f:15}"; done

Связанный контент