Переименование файлов JPEG последовательно в нескольких подпапках - PullRequest
0 голосов
/ 21 февраля 2019

Как я могу переименовать много файлов JPEG, которые находятся во многих подпапках последовательно?
В настоящее время многие из них имеют одинаковые имена файлов (например, frame1.jpeg).Я хочу иметь только 6-значный числовой суффикс для всех файлов jpg, в имени файла которых есть «рамка», но в определенной последовательности, чтобы в дальнейшем я мог переместить их в одну папку без опасности их перезаписи.

Вероятно, есть способ сделать это с помощью find , но я не знаю, как ...

это моя структура папок:

├── mainfolder
|    ├── subfolder1
|    |   ├── frame1.jpg
|    |   └── frame2.jpg
|    |   └── unimportant.jpg
|    |
|    ├── subfolder2
|    |   ├── frame1.jpg
|    |   └── frame2.jpg
|    |   └── unimportant.jpg
|    |
|    ├── subfolder3
|    |   ├── frame.jpg
|    |   └── frame2.jpg
|    |   └── unimportant.jpg
…


Вот как я представляю файлы, которые будут названы в конце:

├── mainfolder
|    ├── subfolder1
|    |   ├── frame0000001.jpg
|    |   └── frame0000002.jpg
|    |   └── unimportant.jpg
|    |
|    ├── subfolder2
|    |   ├── frame0000003.jpg
|    |   └── frame0000004.jpg
|    |   └── unimportant.jpg
|    |
|    ├── subfolder3
|    |   ├── frame0000005.jpg
|    |   └── frame0000006.jpg
|    |   └── unimportant.jpg
…

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

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

Я думаю, я понимаю!Если вы используете homebrew , вы можете использовать:

brew install rename

для установки команды Perl rename.

Затем вы можете запустить это:

find . -name "frame*.jpg" -print0 | rename --dry-run --stdin -0 -N "000001" '$_="frame" . $N . ".jpg"'

, который говорит ... "Найдите все файлы JPEG в текущем каталоге и ниже, которые начинаются с frame... и передают их имена rename с нулевым завершением. Затем утилита rename читаетимена, оканчивающиеся нулем, и запускает счетчик $N с общей шириной в 6 цифр и задает в качестве имени файла слово frame, за которым следует порядковый номер, увеличивающийся на 1 для каждого файла и добавляющий суффикс .jpg ".

Если вывод выглядит хорошо, запустите снова без --dry-run.

0 голосов
/ 21 февраля 2019

Этот Shellcheck -чистый код выведет список mv команды, которая соответствует желаемому:

#! /bin/bash

seqnum=1
find mainfolder -type f -name 'frame*.jpg' -print0 \
    |   while IFS= read -r -d '' jpg_path ; do
            dir=${jpg_path%/*}
            printf -v new_jpg_path '%s/frame%06d.jpg' "$dir" $((seqnum++))
            echo mv -i -- "$jpg_path" "$new_jpg_path"
        done

Тот, кому вы довольны, что он поступит правильноудалите echo перед mv ... и запустите его, чтобы фактически выполнить переименования.Параметр -i для mv предназначен для защиты от перезаписи файлов, которые могут уже существовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...