Как переименовать файлы резервных копий, используя его версию резервной копии в качестве суффикса к имени файла и сделать его больше не скрытым

Я работал с большим количеством файлов изображений. Частично это было перемещением всех типов файлов изображений, которые были распределены по более чем 1000 каталогам, в один напрямую. Было много картинок с одинаковыми названиями, но на самом деле это были разные картинки. Для этого я использовал следующий однострочный файл:

find . -type f -exec mv --backup=t '{}' /media/DATA-HDD/AllImages \;

Я сделал это таким образом, чтобы любые изображения с таким же именем получали скрытый резервный файл, а не перезаписывали его. Это сработало очень хорошо, но теперь у меня есть другая проблема, которую мне нужно решить.

Теперь у меня, конечно, есть много плиток примерно следующего вида:

DSC_0616.NEF
DSC_0616.NEF.~1~
DSC_0616.NEF.~2~

Я хочу запустить команда (или скрипт), который переименует любой из этих скрытых файлов, добавив номер резервной копии в качестве суффикса к имени файла, и удалит. ~ [bu #] ~, чтобы сделать их уникальными и не скрытыми именами. Итак, вот так:

DSC_0616.NEF
DSC_0616_1.NEF
DSC_0616_2.NEF

Я потратил большую часть пары часов на то, чтобы попытаться сделать это сам, но на самом деле не могу найти ничего, что могло бы помочь мне добраться туда, что находится в пределах моих знаний по этой теме .

1
задан 17 August 2020 в 05:18

1 ответ

Пока вы уверены, что все имена названы последовательно, как вы описали выше, некоторые регулярные выражения могут выполнять свою работу с помощью сценарий оболочки:

#!/bin/bash
# sets the file separator to be only newlines, in case files have spaces in them
IFS=$'\n'
for file in $(find . -type f); do
        # parses just the number(s) between two tildes, and only at the end of the file
        number=$(echo $file | grep -Eo "~[0-9]+~$" | sed s/'~'/''/g)
        # if no match found, assume this is a "base" file that does not need to be renamed
        if [ "$number" == "" ]; then
                continue
        fi
        # parses the file name through "NEF", then deletes ".NEF"
        filename=$(echo $file |  grep -Eio "^.+\.NEF" | sed s/'\.NEF'/''/g )
        if [ "$filename" == "" ]; then
                continue
        fi
        mv -v $file $(echo "$filename"_"$number.NEF")
        # if anything went wrong, exit immediately
        if [ "$?" != "0" ]; then
                echo "Unable to move file $file"
                exit 1
        fi
done

Это также будет работать для спуска по каталогам, просто поместите сценарий и выполните его со своим рабочим каталогом в верхней части дерева каталогов вашего проекта. Работа с файлами примеров, подобными предоставленным вами:

###@###:~/project$ find . -type f
./DSC_0616.NEF.~8~
./DSC_0616.NEF.~5~
./DSC_0616.NEF.~1~
./DSC_0616.NEF.~7~
./DSC_0616.NEF.~3~
./DSC_0616.NEF.~4~
./DSC_0616.NEF.~9~
./DSC_0616.NEF.~2~
./DSC_0616.NEF.~6~
./lower_dir/DSC_0616.NEF.~8~
./lower_dir/DSC_0616.NEF.~5~
./lower_dir/DSC_0616.NEF.~1~
./lower_dir/DSC_0616.NEF.~7~
./lower_dir/DSC_0616.NEF.~3~
./lower_dir/DSC_0616.NEF.~4~
./lower_dir/DSC_0616.NEF.~9~
./lower_dir/DSC_0616.NEF.~2~
./lower_dir/DSC_0616.NEF.~6~

после запуска сценария:

###@###:~/project$ find . -type f
./DSC_0616_1.NEF
./DSC_0616_3.NEF
./DSC_0616_7.NEF
./DSC_0616_5.NEF
./DSC_0616_2.NEF
./DSC_0616_9.NEF
./DSC_0616_6.NEF
./DSC_0616_8.NEF
./DSC_0616_4.NEF
./lower_dir/DSC_0616_1.NEF
./lower_dir/DSC_0616_3.NEF
./lower_dir/DSC_0616_7.NEF
./lower_dir/DSC_0616_5.NEF
./lower_dir/DSC_0616_2.NEF
./lower_dir/DSC_0616_9.NEF
./lower_dir/DSC_0616_6.NEF
./lower_dir/DSC_0616_8.NEF
./lower_dir/DSC_0616_4.NEF
1
ответ дан 21 August 2020 в 07:57

Другие вопросы по тегам:

Похожие вопросы: