Как переименовать 2009-08-2009-08-13 в 2009-08 - $my_var_till_2009-08-13 для нескольких файлов? 2009-08-13 часть изменяется относительно даты файла, поэтому мне нужен способ захватить эту часть имени файла. Могу я как-нибудь использовать basename?
Переименование файлов на основе части файла
5 ответов
Если имена файлов всегда в этом формате даты, я думаю, что что-то подобное будет работать (в скрипте) - это, конечно, при условии, что все они находятся в одном каталоге и "$my_var_till " определен в оболочке:
#!/bin/bash
cd <name_of_target_directory>
for i in `ls`
do
yyyy=`echo $i | awk -F- '{print }`'
mm=`echo $i | awk -F- '{print }'`
dd=`echo $i | awk -F- '{print }'`
mv $i "$yyyy-$mm-$my_var_till-$yyyy-$mm-$dd"
done
Если '$my_var_till' не определен в оболочке, вы можете принять его в качестве аргумента командной строки (конечно, вы можете добавить проверку ошибок с аргументом):
#!/bin/bash
my_var_till=
<continue on with code from above>
если у вас есть программа rename
(есть несколько из них, я думаю, у меня есть версия perl):
rename -n -e 's/(\d{4}-\d{2})-([\d-]+)/'"$your_variable"'/' *
это -n
флаг означает, что rename
не изменяет никаких файлов, он просто показывает, что изменится. Удалите его, чтобы переименовать файлы.
mmv поможем:
Если вам когда-нибудь понадобится переименовать или переместить несколько файлов под Linux, то команда mmv shell сделает вашу жизнь проще. Утилита mmv будет также пригодится для копирования нескольких файлов, одного файла в другие файлы, а также для создания ссылок.
этот скрипт переименует любой файл с именем
this: 2009-08-2009-08-13
to: 2009-08-${my_var_till}_2009-08-13
например, если my_var_till="whatever"
, а filename="2009-08-2009-08-13"
, то результат будет:
mv "2009-08-2009-08-13" "2009-08-whatever_2009-08-13"
файлы с именами, которые не в этом формате, будут пропущены.
попробуйте это:
#!/bin/bash
my_var_till="whatever"
for f in *
# test if file is proper format
echo "${f}"|grep -E '^[0-9]{4}-[0-9]{2}-[0-9]{4}-[0-9]{2}-[0-9]{2}$'>/dev/null
if [ $? -eq 0 ]; then
n=$(echo ${f}|sed -r 's/^(.{8})(.{10})$/'"${my_var_till}_/")
mv "${f}" "${n}"
fi
done
Linux:
обязательный 1-лайнер...
for i in `ls`;do echo $i | awk -F- '{print "mv ""-""-""-""-"" ""-""-""'"$my_var_till"'""-""-""-"}';done
расширен
#!/bin/bash
my_var_till=somevalue # can replace with to use command-line arg to script
for i in `ls`
do echo $i | awk -F- '{print "mv ""-""-""-""-"" ""-""-""'"$my_var_till"'""-""-""-"}'
done
вы также можете использовать rename
команда и поставить Perl регулярное выражение.
предполагая, что ваша переменная-это переменная, которую вы установили в оболочке, что я думаю, вы спрашиваете.
Windows:
rename 2009-08* 2009-08-%my_var_till%_*
Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]