Если файлы всегда имеют один уровень каталога в глубину, вы можете выполнить итерацию по ним с помощью чего-то вроде для x в */*_20*_*
. Какой шаблон использовать, зависит от того, какие другие файлы могут присутствовать, которые вы не хотите переименовывать. Шаблон, который я только что дал, предполагает, что дата начинается с 20
и что все файлы, имя которых содержит _20
и еще один знак подчёркивания после этого, должны быть переименованы.
Вы можете выполнить переименование с помощью цикла оболочки, используя конструкции расширения параметров для создания нового имени файла.
for old_name in ./*/*_20_*_*; do
base=${old_name##*/} # remove the directory part
prefix=${base%%_20*} # remove everything from _20
suffix=${base#*_20} # remove everything up to _20
suffix=${suffix#*_} # ... then everything before the first remaining _
mv "$old_name" "${old_name%/*}/${prefix}_${suffix}"
done
Если файлы имеют разную глубину, в bash ≥4.3 вы можете запустить shopt -s globstar
, затем для x в **/*_20*_*; …
. Шаблон **
соответствует любой глубине каталога, если globstar
включен. Это также работает в bash 4.0–4.2 с оговоркой, что он также проходит через символические ссылки на каталоги.Это также работает в zsh и ksh, без оговорок, из коробки в zsh и с set -o globstar
в ksh.