1

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

Итак, я хочу переименовать много файлов. Запись всех имен файлов не вариант. Файлы названы так:

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, он ничего не делает).

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

4 ответа4

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 » в stdin sed , где sed заменит "_039" на "_036_2"

В целом: для каждого файла в текущем каталоге переименуйте файл, заменив "_039" на "_036_2"

1

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

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

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


Обратите внимание на регулярное выражение в sed и rename.

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

-w это отдельное слово и может быть только в search_pattern.

0

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

0

Зацикливать все файлы с префиксом «HAUPT _...», затем переименовывать, используя подстроку оболочки ${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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .