Пакетное переименование имен файлов между дефисами с использованием bash

Я студент, и я очень новичок в bash, поэтому любая помощь очень ценится!

Я пытаюсь переименовать пакет файлов, которые выглядят так: local_date_1415+6556_0001.txt и local_date_1415+6556_0002.txt.

Пример имени файла: uuw_07052006_1415+6556_0001.txt

Мне нужен раздел "1415+6556" каждого имени файла, чтобы перед ним было 2M, например "2M1415+6556". Около половины файлов в папке уже имеют 2M, поэтому я не могу просто найти строку и заменить.

Есть ли способ переименовать пакет файлов, используя "_" в качестве разделителя, чтобы я мог полностью заменить все третьи разделы правильной строкой?

У меня есть команда переименования на моей машине, я просто не знаю, как ее использовать здесь.

1 ответ

Решение

Используя вашу версию rename:

rename _ %   *_????+*.txt    # replace the first underscore with a percent
rename _ _2M *_????+*.txt    # add 2M after the second underscore
rename % _   *_2M????+*.txt  # return the first underscore back

Работает только если ваши имена файлов не содержат %, Если они это сделают, выберите другого персонажа.

Вы также можете написать цикл самостоятельно:

#! /bin/bash
for f in *_????+*.txt ; do
    before=${f%[0-9][0-9][0-9][0-9]+*}
    after=${f#*_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]}
    mv "$f" "$before"2M"$after"
done
Другие вопросы по тегам