Как переименовать 2009-08-2009-08-13 в 2009-08- $ my_var_till_2009-08-13 для нескольких файлов? Часть 2009-08-13 изменяется в зависимости от даты файла, поэтому мне нужен способ получить эту часть имени файла. Могу ли я использовать базовое имя как-нибудь?

5 ответов5

1

Если имена файлов всегда имеют такой формат даты, я думаю, что что-то подобное будет работать (в скрипте) - это, конечно, при условии, что они все находятся в одном каталоге, а в оболочке определено «$ 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>
1

Если у вас есть утилита rename (я думаю, есть несколько из них, у меня есть версия perl):

rename -n -e 's/(\d{4}-\d{2})-([\d-]+)/$1'"$your_variable"'$2/' *

Этот флаг -n означает, что rename не меняет никаких файлов, оно просто показывает, что изменится. Удалите его, чтобы переименовать файлы.

0

ммв может помочь:

Если вам когда-нибудь придется переименовать или переместить несколько файлов в Linux, то команда mmv shell сделает вашу жизнь проще. Утилита mmv также пригодится для копирования нескольких файлов, добавления содержимого одного файла в другие файлы, а также для создания ссылок.

0

Этот скрипт переименует любой файл с таким именем

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
-1

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%_*

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .