Переименовать большое кол-во файлов по шаблону в shell

Переименовать файлы по шаблону в консоле можно разными способами, некоторые дают такие преимущества, как замена определённых символов в названиях. Я опишу два способа переимновать файлы.
rename shell

Стандартно с помощью MV

Самый стандартный способ, с помощью mv (move). Можно задать маску для применяемых файлов.

#Переименовать текстовый файл содержащий подстроку abc, на bbc
mv *bbc*.txt abc.txt

Утилита rename

Во многих unix-системах доступна утилита rename или же её можно установить отдельно. Эта утилита позволяет переименовать скоп файлов по шаблону "Что - На Что - Где".

#Переименуем все файлы с расширением .txt, заменив .txt на .text:
rename .txt .text *.txt

#Заменим во всех файлах c подстрокой ffa, подстроку abc на dda:
rename abc dda *ffa*

#Обработать можно и один, указанный файл:
rename abc dda one-abc.txt
#Получим файл: one-dda.txt, заместо one-abc.txt
Утилита имеет опции, смотрите "man rename"

Скрипт

Кроме использования определённых утилит, можно использовать сразу несколько утилит в shell-скриптах. Тут всё ограничено лишь фантазией.

#Скрипт рекурсивно переименует файлы с подстрокой abc в запускаемой папке, изменив abc на bbc.
find * -type f | while read F; do
    mv -vf "$F" "$(dirname "$F")/$(basename "$F" | sed 's|abc|bbc|')";
done
#Результат отобразиться выводом на экран.
#Измените find * на find *.txt, чтобы изменения были затронуты только для файлов с расширением .txt

#Вот ещё несколько вариантов скриптов (не проверены), для разных случаев.
for file in $(find . -name "*_test.rb")
do 
  echo mv $file `echo $file | sed s/_test.rb$/_spec.rb/`
done
#другой вариант 2##################################################################
for i in `find -name '*_test.rb'` ; do mv $i `echo $i | sed 's/test/spec/'` ; done
#другой вариант 3##################################################################
find . -name '*_test.rb' -exec bash -c 'echo mv $0 ${0/test.rb/spec.rb}' {} \;
#другой вариант 4##################################################################
IFS=$'\n'
function RecurseDirs
{
for f in "$@"
do
  newf=echo "${f}" | sed -e 's/^(.*_)test.rb$/\1spec.rb/g'
    echo "${f}" "${newf}"
    mv "${f}" "${newf}"
    f="${newf}"
  if [[ -d "${f}" ]]; then
    cd "${f}"
    RecurseDirs $(ls -1 ".")
  fi
done
cd ..
}
RecurseDirs .

Комментарии и отзывы к материалу

Открыта вакансия на первого комментатора!

Отправить комментарий

Как зовут?

Сообщение