Изменить некоторые имена файлов (префикс на постфикс)

У меня есть каталог, содержащий тысячи файлов с именами t_00xx_000xxx.png и 00xx_000xxx.png . Я хочу изменить имена файлов, которые начинаются с t_ , например, t_00xx_000xxx.png на 00xx_000xxx_t.png

Поэтому возьмите префикс и поместите его в качестве постфикса для некоторых файлов. Можно ли это сделать только одной командой?

Я работаю на SUSE SLES12 SP2.

Это сработает, если мы примем все до первого подчеркивания в качестве префикса.

 for f in *.png; do new=$(echo "$f" | sed -r 's/^([^_]*)_(.*)\.(.*)$/\2_\1.\3/'); echo "Renaming: $f => $new"; #mv $f $new done 

Удалите # перед mv если вы довольны выводом.


С prename было бы немного проще:

 prename -n 's/^([^_]*)_(.*)\.(.*)$/$2_$1.$3/' 

Если t_ всегда является префиксом, измените этот шаблон:

 for f in t_*.png; do new=$(echo "$f" | sed -r 's/^t_(.*)\.(.*)$/\1_t.\2/'); echo "Renaming: $f => $new"; #mv $f $new done 

Учитывая шаблон имени файла t_00xx_000xxx.png где x может быть любым отдельным символом, следующий цикл использует ? заменяющий символ заменитель. Цикл выбирает только те файлы, которые начинаются с t_ и заканчиваются на .png . Он использует расширение параметра, чтобы убрать t_ , затем извлекает нужную подстроку, чтобы переместить _t в желаемое положение.

 for f in t_00??_000???.png do echo mv -- "$f" "${f:2:11}_t.png" done 

Для некоторых вымышленных имен файлов пример вывода:

 mv t_0011_000111.png 0011_000111_t.png mv t_0012_000345.png 0012_000345_t.png mv t_00xx_000xxx.png 00xx_000xxx_t.png 

Удалите часть echo если результаты выглядят правильно.

В синтаксисе sh :

 for f in t_*.*; do dest=${f#t_} dest=${dest%.*}_t.${dest##*.} echo mv -i -- "$f" "$dest" done 

Если SuSE SLES12 имеет команду mcp / mmv в своем репозитории, то было бы просто использовать mmv :

 mmv 't_*.png' '#1_t.png' 

Или, если количество символов и конкретных чисел было проблемой, вы могли бы быть более конкретным, как:

 mmv 't_00??_000???.png' '00#1#2_000#3#4#5_t.png' 

Первый аргумент mmv – это source, со стандартными подстановочными знаками * и ? , Второй аргумент – назначение, в котором # 1 заменяется контентом, которому соответствует первый подстановочный знак, # 2 контентом, которому соответствует второй подстановочный знак и т. Д.

Пример:

 % ls -1 t_0011_000037.png t_0011_000038.png t_0011_000039.png t_0022_000001.png t_0022_000002.png % mmv 't_*.png' '#1_t.png' % ls -1 0011_000037_t.png 0011_000038_t.png 0011_000039_t.png 0022_000001_t.png 0022_000002_t.png