![Как переименовать много файлов в оболочке bash?](https://rvso.com/image/1416382/%D0%9A%D0%B0%D0%BA%20%D0%BF%D0%B5%D1%80%D0%B5%D0%B8%D0%BC%D0%B5%D0%BD%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%20%D0%B2%20%D0%BE%D0%B1%D0%BE%D0%BB%D0%BE%D1%87%D0%BA%D0%B5%20bash%3F.png)
Извините за вопрос. Я много искал в интернете, но не смог найти ответ, который бы сработал (хотя было много предложений).
Итак, я хочу переименовать МНОГО файлов. Писать все имена файлов не вариант. Файлы называются так:
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