1

У меня есть семейные фотографии и видео на десятилетия, которые организованы и помечены в дереве каталогов, содержащем тысячи каталогов. В общем, пути к файлам выглядят так:

/my_giant_pictures_dir/year/month_day_ "описание события"/ имя файла

Примером может быть:

/my_giant_pictures_dir/2016/07_27_Путешествие в Антарктиду /IMG_00001.jpg

обратите внимание, что «event» или самые глубокие каталоги могут содержать файлы .jpg, .mp4 и .mts.

Моя проблема с этим соглашением состоит в том, что я получаю много глубочайших медиа-каталогов, которые, поскольку они упорядочены по дате, содержат только один или несколько файлов. (Дни, когда был сделан только один снимок, например). Это делает просмотр, скажем, всех снимков, сделанных в течение трех месяцев, довольно утомительным.

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

вместо:

/ Фотографии / 2016 / 07_27_Путешествие в Антарктиду / IMG_00001.jpg

...Я бы предпочел иметь:

/ Фотографии / 2016 / 07_27_Путешествие в Антарктиду_IMG_00001.jpg

Есть ли команда bash, которая делала бы это для каждого файла .jpg, .mp4 и .mts во всей моей папке с изображениями, а затем, после имени файла, добавьте их из родительского каталога в следующий самый высокий каталог, который в каждом дело год каталог?

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

Заранее большое спасибо!

1 ответ1

1

Пытаться:

find /my_giant_pictures_dir/ -type f -regex '.*\(jpg\|mp4\|mts\)' -execdir bash -c 'mv "$1" "../${PWD##*/}_${1#./}"' Bash {} \;

Как это устроено

  • find /my_giant_pictures_dir/ -type f -regex '.*\(jpg\|mp4\|mts\)'

    Это ищет все обычные файлы в любом месте под /my_giant_pictures_dir/ чьи имена заканчиваются на jpg, mp4 или mts. Каждый такой файл, в свою очередь, передается в -execdir .

  • -execdir bash -c 'mv "$1" "../${PWD##*/}_${1#./}"' Bash {} \;

    Это перемещает файл в его родительский каталог, а также переименовывает его.

    Более подробно -execdir bash -c '...' Bash {} \; изменяет текущий рабочий каталог на каталог, в котором находится файл, и выполняет bash -c '...' с аргументами Bash и именем файла {} .

    bash -c '...' запускает команду в одинарных кавычках с $0 имеющим значение Bash и $1 имеющим в качестве значения имя файла.

    Внутри одинарных кавычек у нас есть mv "$1" "../${PWD##*/}_${1#./}" Это перемещает файл $ в его родительский каталог, ../ с именем ${PWD##*/}_${1#./} .

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