Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Сценарий для перемещения файлов по условию даты создания [РЕШЕНО]  (Прочитано 14061 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Jack Sparrow

  • Автор темы
  • Активист
  • *
  • Сообщений: 630
    • Просмотр профиля
Проблема в следующем. Долгое время сваливад фотографии с камеры в одну папку. Теперь их там около 7000. Работа замедлилась. Хочу написать скрипт, который создал бы папки вида "2008-09-12" (по датам создания файлов) и переместил бы в них соответствующие файлы. В итоге в каждой папке должны оказаться файлы только с одинаковой датой создания/модификации.
В написании сценариев я не слишком искушен, особенно что касается операций по условию. Буду рад любой помощи.
« Последнее редактирование: 15 Марта 2010, 00:54:44 от jack_sparrow »
Linux is only free if your time has no value (c) Jamie Zawinski

Оффлайн Scorry

  • Активист
  • *
  • Сообщений: 842
    • Просмотр профиля
Хочу написать скрипт, который создал бы папки вида "2008-09-12" (по датам создания файлов) и переместил бы в них соответствующие файлы. В итоге в каждой папке должны оказаться файлы только с одинаковой датой создания/модификации.
В написании сценариев я не слишком искушен, особенно что касается операций по условию. Буду рад любой помощи.
если мне не изменяет мой склероз, то F-Spot именно таким образом импортирует файлы с камеры. не знаю, пользуется он датой создания или EXIF-данными, но если вы не сильны в скриптах, то попробовать программу с гуём стоит, я думаю.

Оффлайн skiffartur

  • Новичок
  • *
  • Сообщений: 40
    • Просмотр профиля
Я думаю, что пока помощь будет заключаться в этом ;)
https://forum.ubuntu.ru/index.php?topic=36907.0
А вот когда будут затыки - милости просим :coolsmiley:

Оффлайн Jack Sparrow

  • Автор темы
  • Активист
  • *
  • Сообщений: 630
    • Просмотр профиля
Scorry: С F-Spot ничего не вышло: файлов много, помимо тех 7000 в одной папке есть примерно столько же в других разных. Пока он все это импортировал, я успел сходить погулять 45 минут :)
skiffartur: За ссылку - спасибо. Буду изучать на досуге. Только там все основательно. Мне сейчас бы подсказку, что можно использовать.
Я пока не очень со скриптами; чуть получше с конвеерной обработкой. Пока наваял вот что:
(Нажмите, чтобы показать/скрыть)
После этого в текущей папке создаются пустые папки с нужными именами. Теперь нужно как-то заставить файлы перейти в соответствующие папки. Пусть это даже будет вторая строка кода. Чувствую одним местом, что нужно использовать xargs, только как? Он не совсем интуитивно понятный. Удивляюсь, что хватило ума и в первую строчку вставить. Может есть эксперты по xargs?
Linux is only free if your time has no value (c) Jamie Zawinski

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
jack_sparrow, в первом приближении...
find . -type f | while read FILE ; do DIR=$(ls -lt "$FILE" | awk '{print $6}') ; test -d $DIR || mkdir $DIR ; mv "$FILE" $DIR ; done

Оффлайн skiffartur

  • Новичок
  • *
  • Сообщений: 40
    • Просмотр профиля
#/usr/bin/bash
basepath=/tmp/
searchpath=/home/

for file in `find $searchpath -type f -iname '*.jpg' -exec ls '{}' \;`
do
currentfile=`ls -lt $file| awk '{print $6}'`
echo Копирование $file в директорию $basepath$currentfile
mkdir $basepath$currentfile 2>/dev/null
cp $file $basepath$currentfile
done

Оффлайн Jack Sparrow

  • Автор темы
  • Активист
  • *
  • Сообщений: 630
    • Просмотр профиля
Попробовал способ от skiffartur. В принципе, работает. Нужно лишь немного доработать. Во-первых, вместо /home указать папку с фотографиями, а то ищет везде (у меня фотки на внешнем). Во-вторых, наверное, вместо /tmp можно указать исходную папку? Но главное, не перемещаются файлы с пробелами (т.к. поиск был в домашней папке, нашлось все что угодно, даже картинки из книжек). Наверное надо в find добавить что-то вроде -print0 или что-то в этом роде.
В любом случае, спасибо. Лучший спрособ научиться чему-либо - разобрать по косточкам то, что кто-то более умный сделал.
Linux is only free if your time has no value (c) Jamie Zawinski

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Но главное, не перемещаются файлы с пробелами
Поэтому лучше цикл с while. ;)

Оффлайн ploop

  • Активист
  • *
  • Сообщений: 762
    • Просмотр профиля
Еще советую автору это в качестве справки. Меня не раз выручало.

Оффлайн Jack Sparrow

  • Автор темы
  • Активист
  • *
  • Сообщений: 630
    • Просмотр профиля
Почитав немного мануалы и предложенные ссылки, решил таки довести дело до конца, т.е. чтобы уже с камеры фотографии попадали в нужные папки. Изменив немного предложенный ArcFi код, создал такое вот чудо:
SOURCE=~/test/Source   # исходная папка
TARGET=~/test/Target     # конечная папка
find $SOURCE -iname "*.jpg" -or -iname "*.avi" -or -iname "*.mov" |
while read FILE ; do DIR=$(ls -lt "$FILE" |
awk '{print $6}') ;
test -d $TARGET/$DIR ||
mkdir $TARGET/$DIR ;
cp -u "$FILE" $TARGET/$DIR/ ;
done
Попробовал на тестовых файлах. Все получилось (вроде бы как) великолепно, только одно но: после этого скрипта все файлы поменяли время на текущее. Вроде бы уже и не важно, но все равно осадок: а вдруг потом нужно будет опять искать с find по дате, а не просто визуально просматривая папки. Одним словом, непорядок.
Сегодня голова уже не соображает. Позже буду прилаживать touch, если не найдется другое, более изящное решение.
Linux is only free if your time has no value (c) Jamie Zawinski

Оффлайн skiffartur

  • Новичок
  • *
  • Сообщений: 40
    • Просмотр профиля

man cp
...
--preserve[=ATTR_LIST]
              preserve the specified attributes (default: mode,ownership,time‐
              stamps),  if  possible  additional  attributes:  context, links,
              xattr, all
...

На сколько я понимаю - то что доктор прописал

Оффлайн Jack Sparrow

  • Автор темы
  • Активист
  • *
  • Сообщений: 630
    • Просмотр профиля
Цитировать
На сколько я понимаю - то что доктор прописал
Все гениальное - просто! Я тут встал со свежей головой, а еще утром в полудреме пришла мысль, что mv, как было у ArcFi, не создает новые файлы, а только перемещает. Поэтому там никаких изменений не наблюдалось. А cp создает новые файлы, поэтому-то и время доступа меняется. Спасибо за опцию, не знал.

Я вот почему затеял это с копированием, а не с перемещением. Пару лет назад написал простенький скрипт для Windows, ну там, копировать новые файлы с камеры на диск в одну папку (за два года около 7000 набралось). Помню, вначале пробовал не копировать, а перемещать, чтобы на камере не оставалось. Возникла проблема, с которой я полностью не разобрался (может ее и не было вовсе): нумерация новых снимков не продолжалась, а снова начиналась с первого удаленного снимка. Другими словами, если, скажем, было 100 фоток с номерами 001 до 100, затем скрипт удалил их с камеры, то когда начинаешь снова фотографировать, нумерация должна продолжаться: 101, 102 и т.д. Ан нет. Нумерация начиналась с первого удаленного снимка: 001, 002 и т.д.  Следствие: разные фотографии с одними и теми же именами. В одной папке они быть не могли, поэтому и затеял копирование вместо перемещения. А удалял штатными средствами самой камеры (Olympus). Повторяю, это было давно и, возможно, неправда. Но все равно, копирование с этой опцией, думаю, будет все же безопаснее.

Единственное, что меня гложет это то, что все это построено на времени последнего изменения файла, а не на EXIF. Если они совпадают, тогда нет проблем. А если нет? Да и возьмем, к примеру, такой вариант. Допустим, когда-то я открыл файл, отретушировал его и сохранил. Ведь время модификации изменится? А теперь скрипт разложит все по полочкам, в результате я долго буду искать себя любимого с Новогодней елкой, искренее недоумевая, как же Новый год наступил в мае.
Попробую еще сравнить информацию их data stamp с EXIF.
Linux is only free if your time has no value (c) Jamie Zawinski

Оффлайн ploop

  • Активист
  • *
  • Сообщений: 762
    • Просмотр профиля
Цитировать
Допустим, когда-то я открыл файл, отретушировал его и сохранил. Ведь время модификации изменится?
Да. Тут надо погуглить на счет консольных утилит, достающих EXIF - данные. Они наверняка есть. Ну а дальше дело техники - вставить её вызов в скрипт, распарсить данные (вынуть дату) и вперёд!

Оффлайн MadKox

  • Активист
  • *
  • Сообщений: 441
  • =)
    • Просмотр профиля
    • Моя страница на Launchpad
Цитата: $ sudo aptitude show exif
Пакет: exif
Состояние: не установлен
Версия: 0.6.17-1
Приоритет: необязательный
Раздел: universe/graphics
Сопровождающий: Ubuntu MOTU Developers <ubuntu-motu@lists.ubuntu.com>
Размер в распакованном виде: 279k
Зависимости: libc6 (>= 2.4), libexif12, libpopt0 (>= 1.14)
Описание: command-line utility to show EXIF information in JPEG files
 Most digital cameras produce EXIF files, which are JPEG files with extra tags
 that contain information about the image.
 
 'exif' is a small command-line utility to show EXIF information hidden in JPEG
 files.
Сайт: http://libexif.sourceforge.net/
Homo homini admini est...

Оффлайн Jack Sparrow

  • Автор темы
  • Активист
  • *
  • Сообщений: 630
    • Просмотр профиля
Сравнил время timestamp со временем EXIF. Иногда разница всего пара часов, иногда - несколько дней. Значит это не одно и то же. По подсказке MadKox стал ставить пакет exif через Synaptic. Весит 30 кб, но пока ставил, успел заметить, что рядом есть что-то похожее: exiv2, причем уже установлено. Стал читать к нему мануал и сразу забыл про exif (наверное, exif тоже хорош, но exiv2 мне подошел сразу). Используется так:
exiv2 -T mv image.jpgПо этой команде время модификации файла синхронизируется с тем, что у него стоит в EXIF, что нам и нужно. Имя файла при этом не изменяется.
Здесь описан откат к прежнему состоянию (все файлы в одной папке).
(Нажмите, чтобы показать/скрыть)
Когда мы снова в прежнем состоянии (все файлы в одной папке), меняем их время модификации на то, что стоит в EXIF:
exiv2 -T mv *.jpg
Теперь можно с чистой совестью запускать скрипт от ArcFi с небольшим изменением:
find . -iname "*jpg" | while read FILE ; do DIR=$(ls -lt "$FILE" | awk '{print $6}') ; test -d $DIR || mkdir $DIR ; mv "$FILE" $DIR ; done

Ну что, осталось только наладить прямой перенос с камеры на диск.

Пользователь решил продолжить мысль 17 Марта 2010, 23:23:55:
После того, как все было приведено в порядок, подправил скрипт, чтобы копировать с камеры на диск напрямую.
#!/bin/bash

# Скрипт копирует файлы с камеры на диск, создавая папки
# одноименные дате фотографии и помещая их туда.

SOURCE=/media/disk/DCIM/100OLYMP       # исходная папка (на камере)
TARGET=/media/External_320/Pictures/Olympus     # папка для копирования
find $SOURCE -iname "*.jpg" -or -iname "*.avi" -or -iname "*.mov" |
while read FILE ; do DIR=$(ls -lt "$FILE" |
awk '{print $6}') ;
test -d $TARGET/$DIR ||
mkdir $TARGET/$DIR ;
cp -uv --preserve "$FILE" $TARGET/$DIR/ ;
done
Записал это в текстовый файл, назвал olympus, сделал исполняемым и поместил в /usr/local/bin
Теперь все копируется по команде olympus
Не знаю только, при подключении всяких там флешек и т.п. не будет ли меняться путь к исходной папке. Имею в виду /media/disk
На Windows такое случалось, когда было подключено несколько USB или скрипт запускался с другого компьютера. Приходилось в блокноте открывать и менять буквы дисков. Ну ладно, поживем - увидим.
Благодарность всем, кто дал ссылки, а особенно - ArcFi за скрипт.
« Последнее редактирование: 17 Марта 2010, 23:23:55 от jack_sparrow »
Linux is only free if your time has no value (c) Jamie Zawinski

 

Страница сгенерирована за 0.04 секунд. Запросов: 23.