Переименовать большое кол-во файлов по шаблону в 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 .
Комментарии и отзывы к материалу
Открыта вакансия на первого комментатора!Отправить комментарий
Как зовут?
Сообщение