Реорганизовать папки с помощью скрипта - PullRequest
1 голос
/ 22 августа 2009

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

Проблема a: Музыкальная коллекция

Я хочу, чтобы моя музыкальная коллекция выглядела как: /Artist/Album/files.*
но сейчас есть несколько экземпляров /A/Artist/Album/files.*

Я пытаюсь написать скрипт, который:
1. Найти все папки с 1 символом,
2.Переместить содержимое каждой односимвольной папки в / Artist /
(Свести структуру и обработать пробелы в именах файлов)

find ./Artists/ -name "?" -maxdepth 1 -mindepth 1 | mv * ./Artists/

Получает меня наполовину, но не обрабатывает пробелы в именах каталогов,и я немного не уверен, есть ли у него другие подводные камни.

Проблема b: сбор фотографий

У меня очень похожая ситуация, большая часть моей коллекции выглядит такЯ хочу это.Желаемый:
/ Фотографии / 2009 / 2009-08-07 Описание / filename.jpg

Текущая ситуация:
/Photos/2009/03/21/filename.jpg

Мне нужен скрипт, который:
1. Найдите все папки, которые соответствуют / гггг / мм / дд /
2. Переместите содержимое в / гггг-мм-дд /
3. Удалите старые папки

Справочная информация

Я считаю, что bash-скрипт хорошо подойдет, но я тоже готов к чему-то в python.
Я использую Ubuntu 9.04.

Заранее спасибо.

Ответы [ 4 ]

1 голос
/ 22 августа 2009

Попробуйте это.

find ./Artists/ -name "?" -maxdepth 1 -mindepth 1 -exec mv {} ./Artists/ \;

Передача вывода find теряет различие между пробелами в именах файлов и отдельных файлах. -exec будет запускать mv для каждого найденного файла, по одному за раз. -ok делает то же самое, но сначала запрашивает подтверждение.

0 голосов
/ 22 августа 2009

Используйте find -print0 и xargs '-0 для обработки пробелов.

Попробуйте что-то вроде:

find [A-Z]/* -type d -maxdepth 1 -mindepth 1 -print0 \
| xargs -r0 -I'{}' mv {} Artists/
0 голосов
/ 22 августа 2009

Для второго запроса попробуйте что-то вроде этого:

#!/bin/bash
find $PHOTO_DIR -regextype posix-extended -type d -regex '.*/[0-9]{4}/[0-9]{2}/[0-9]{2}$' |
while read dir; do
    newdir="$(echo $dir | sed 's@/\([0-9]\{4\}\)/\([0-9]\{2\}\)/\([0-9]\{2\}\)$@/\1-\2-\3@')"
    mv "$dir" "$newdir"
    rmdir "$(dirname $dir)"
    rmdir "$(dirname $(dirname $dir))"
done

Это сработало для моего простого тестового примера; чтобы убедиться, что он работает правильно, поставьте echo перед тремя линиями действия (mv и дважды rmdir).

Как общий совет, передача вывода find в цикл while read предназначена не только для сценариев - это очень мощная однострочная техника для выхода за пределы find -exec.

0 голосов
/ 22 августа 2009

У меня есть простой скрипт на Python. Хотя ваш случай очень специфичен, я предпочитаю отправлять фотографии в отдельные папки, просматривая информацию EXIF. Он копирует фотографии из SRC в DST, где он создает папку для каждого дня. Он использует EXIF.py. Итак, вот и все:

import  EXIF, os, re, shutil, sys

__date__ ="$Jun 4, 2009 1:27:16 PM$"

if __name__ == "__main__":
    if len(sys.argv) < 3:
        print "No params given. PhotoDispatcher.py <SRC> <DST>" 
        exit(1)
    src = sys.argv[1]
    dst = sys.argv[2]
    for path, directories, files in os.walk(src):
        for filename in files:
        curfile = src+'/'+filename
            f = open(curfile, 'rb');
        tags = EXIF.process_file(f, stop_tag='EXIF DateTimeOriginal')
    f.close()
        try: dateTimeOrig = tags['EXIF DateTimeOriginal'].__str__()[0:10]
    except KeyError:
        print "unable to read DateTimeOriginal tag", filename
        continue
        dirName = re.sub(':','.', dateTimeOrig) 
        newdir = dst+'/'+dirName
    try: os.mkdir(newdir)
    except os.error:
       print "unable to create directory: ", os.error
        newfile = newdir+'/'+filename
    print curfile, '-->', newfile
        shutil.move(curfile, newfile)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...