Как добавить части имен каталогов в пути файла к имени файла в bash или python? - PullRequest
0 голосов
/ 19 ноября 2018

Я недавно освободился от своей системы MacOS. Одной из самых больших проблем, с которыми я столкнулся, было сохранение семнадцатилетних семейных изображений, которые я сохранил в iPhoto.

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

Сейчас моё дерево папок 'Pictures' выглядит так:

 2004/    
 2005/    
 2006/    
 2007/    
 2008/    
 2009/    
 2010/    
 2011/    
 2012/    
      01_January/    
      02_February/    
      03_March/    
      04_April/    
      05_May/    
      06_June/       
           18June, 2012/    
                File - 001.jpg     
                File - 002.jpg    
                File - 003.jpg    
                etc...    
           24June, 2012/    
                File - 001.jpg    
                File - 002.jpg    
                File - 003.jpg    
                etc...    
      07_July/    
      08_August/    
      09_September/    
      10_October/    
      11_November/    
      12_December/
 2013/    
 2014/    
 2015/    
 2016/    
 2017/    
 2018/   

Каждый год каталог содержит двенадцать месяцев каталогов. В каждом месячном каталоге есть дневной каталог, только если есть изображения для этого дня.

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

Пример:

 ./2012/06_June/18June, 2012/      
      File - 001.jpg   ------->   2012-06-18_File - 001.jpg    
      File - 002.jpg   ------->   2012-06-18_File - 002.jpg    
      File - 003.jpg   ------->   2012-06-18_File - 003.jpg     
      etc...

Может кто-нибудь помочь мне найти способ сделать это? Сценарий Python или Bash, я в порядке, учусь делать это в любом. Благодарю.

Ответы [ 3 ]

0 голосов
/ 19 ноября 2018

Предполагая, что вы находитесь в папке «Изображения», вы можете попробовать следующий код. Пожалуйста, сначала проверьте правильность новых имен, а затем раскомментируйте закомментированную строку.

from glob import glob
import os
import re
for i in os.scandir(os.getcwd()):
    if i.is_dir():
        year = i.name
        os.chdir(i.name)
        for j in os.scandir(os.getcwd()):
           if j.is_dir() and os.listdir(j.name):
               month = re.compile(r'(\d+)').split(j.name)[-2]
               os.chdir(j.name)
               for k in os.scandir(os.getcwd()):
                   if k.is_dir():
                       day = re.compile(r'(\d+)').split(k.name)[-4]
                       os.chdir(k.name)
                       for l in glob('*.jpg'):
                           newName = year + '-' + month + '-' + day + '_' + l
                           print(l)
                           print(newName)
                           # os.rename(l, newName)
                       os.chdir('..')
               os.chdir('..')
        os.chdir('..')
0 голосов
/ 20 ноября 2018

Это решение ( Shellcheck -clean) Bash:

#! /bin/bash

shopt -s nullglob   # Globs that match nothing expand to nothing

for file_path in [12][0-9][0-9][0-9]/[01][0-9]_*/[0-3][0-9]*/*.jpg ; do
    IFS=/ read -r year month_name day_month_year file_name <<<"$file_path"
    month=${month_name%%[^0-9]*}
    day=${day_month_year%%[^0-9]*}

    day_month_year_path=${file_path%/*}
    new_file_name=${year}-${month}-${day}_${file_name}
    new_file_path=${day_month_year_path}/${new_file_name}

    printf '    %s   ------->   %s\n' \
        "$file_path" "$new_file_path" >&2

    #UNCOMMENT mv -- "$file_path" "$new_file_path"
done

Запустите его в каталоге, содержащем каталоги года (2004, ...).

Если вы счастливы, что он будет правильно переименовывать файлы, удалите #UNCOMMENT из начала строки mv и запустите его снова, чтобы фактически переименовать файлы.

См. Как разделить строку на разделителе в Bash? , чтобы узнать, как работает строка IFS=/ read -r ... <<<"$file_path".

См. Удаление части строки (BashFAQ / 100 (Как мне манипулировать строками в bash?)) для получения информации о ${var##pattern} и ${var%%pattern}.

См. glob - Вики Грега для получения информации о шаблонах, таких как шаблон в строке for, */ и [^0-9]*.

0 голосов
/ 19 ноября 2018

Решение, которое у меня есть, использует python, просто ищет все файлы в вашем PATH и использует сумму String для создания имени вашего изображения

...