Как переименовать 2009-08-2009-08-13 в 2009-08- $ my_var_till_2009-08-13 для нескольких файлов? Часть 2009-08-13 изменяется в зависимости от даты файла, поэтому мне нужен способ получить эту часть имени файла. Могу ли я использовать базовое имя как-нибудь?
5 ответов
Если имена файлов всегда имеют такой формат даты, я думаю, что что-то подобное будет работать (в скрипте) - это, конечно, при условии, что они все находятся в одном каталоге, а в оболочке определено «$ my_var_till» :
#!/bin/bash
cd <name_of_target_directory>
for i in `ls`
do
yyyy=`echo $i | awk -F- '{print $3}`'
mm=`echo $i | awk -F- '{print $4}'`
dd=`echo $i | awk -F- '{print $5}'`
mv $i "$yyyy-$mm-$my_var_till-$yyyy-$mm-$dd"
done
если «$ my_var_till» не определено в оболочке, вы можете принять его в качестве аргумента командной строки (конечно, вы можете захотеть добавить некоторую проверку ошибок с помощью аргумента):
#!/bin/bash
my_var_till=$1
<continue on with code from above>
Если у вас есть утилита rename
(я думаю, есть несколько из них, у меня есть версия perl):
rename -n -e 's/(\d{4}-\d{2})-([\d-]+)/$1'"$your_variable"'$2/' *
Этот флаг -n
означает, что rename
не меняет никаких файлов, оно просто показывает, что изменится. Удалите его, чтобы переименовать файлы.
ммв может помочь:
Если вам когда-нибудь придется переименовать или переместить несколько файлов в 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})$/'"\1${my_var_till}_\2/")
mv "${f}" "${n}"
fi
done
Linux:
обязательный 1-лайнер ...
for i in `ls`;do echo $i | awk -F- '{print "mv "$1"-"$2"-"$3"-"$4"-"$5" "$1"-"$2"-""'"$my_var_till"'""-"$3"-"$4"-"$5}';done
расширенный
#!/bin/bash
my_var_till=somevalue # can replace with $1 to use command-line arg to script
for i in `ls`
do echo $i | awk -F- '{print "mv "$1"-"$2"-"$3"-"$4"-"$5" "$1"-"$2"-""'"$my_var_till"'""-"$3"-"$4"-"$5}'
done
Вы также можете использовать команду rename
и предоставить регулярное выражение Perl.
предполагая, что ваша переменная - это переменная, которую вы установили в оболочке, о чем я думаю, вы спрашиваете.
Окна:
rename 2009-08* 2009-08-%my_var_till%_*