Переименование файлов на основе части файла

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

22
задан random
01.04.2023 12:39 Количество просмотров материала 3311
Распечатать страницу

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>
1
отвечен Creepygeek 2023-04-02 20:27

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

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

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

1
отвечен apricot boy 2023-04-02 22:44

mmv поможем:

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

0
отвечен user7963 2023-04-03 01:01

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

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
0
отвечен Kevin Fegan 2023-04-03 03:18

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%_*
-1
отвечен John T 2023-04-03 05:35

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх