У меня есть огромная папка изображений, которые я собрал за годы, которые мои студенты используют для курсовой работы. Началось с примерно двадцати изображений, так что я не особо задумывался об именах файлов или какой-либо структуре, просто помечал их и вставлял в них. В той же папке сейчас находится около 5000 изображений, и она доходит до того, что это трудно работать с.
В идеале я хотел бы иметь возможность запускать команду (сейчас и в будущем, когда будет представлено больше), которая будет смотреть на тег (ы) изображений и создавать каталог с именем тега и переместить это изображение в него, или если предыдущее изображение уже создало этот каталог, просто переместите изображение в этот каталог.
Я не уверен, что делаю очень хорошую работу, объясняя это.
Первые 5 изображений, например, автомобили - BMW, Honda, Ford, Alfa Romeo и другой BMW. Имена файлов все уникальны - они все в одной папке, помните. Итак, после запуска этого мифического сценария у меня будет 4 папки с двумя изображениями в BMW.
Все помечено в Shotwell, в основном это JPG с несколькими PNG, добавленными только для того, чтобы усложнить ситуацию! Может быть несколько тегов, но 95% - это просто отдельные теги. Я не уверен, где хранятся теги, но я предполагаю, что в каждом файле теги отображаются на обоих моих компьютерах, но были помечены только на главном.
Дальнейшие исследования показали, что теги хранятся в отношении «ключевых слов» отдельного изображения, поэтому, возможно, мне следует спросить, как создавать каталоги на основе его ключевых слов?
Я очень много учусь, как я иду здесь!
Если это помогает, это вывод из exiftool
:
$ exiftool 010.jpg
ExifTool Version Number : 10.10
File Name : 010.jpg
Directory : .
File Size : 274 kB
File Modification Date/Time : 2016:04:23 21:03:59+01:00
File Access Date/Time : 2016:04:23 21:03:59+01:00
File Inode Change Date/Time : 2016:04:23 21:03:59+01:00
File Permissions : rw-rw-r--
File Type : JPEG
File Type Extension : jpg
MIME Type : image/jpeg
JFIF Version : 1.01
Resolution Unit : inches
X Resolution : 72
Y Resolution : 72
Exif Byte Order : Little-endian (Intel, II)
Software : Shotwell 0.22.0
XMP Toolkit : XMP Core 4.4.0-Exiv2
Subject : BMW, Bell_Photography
Current IPTC Digest : 6249bf63f46e9abb15cfe27d71a87a72
Keywords : BMW, Bell_Photography
Originating Program : Shotwell
Program Version : 0.22.0
Image Width : 936
Image Height : 1334
Encoding Process : Baseline DCT, Huffman coding
Bits Per Sample : 8
Color Components : 3
Y Cb Cr Sub Sampling : YCbCr4:4:4 (1 1)
Image Size : 936x1334
Megapixels : 1.2
Предполагая, что имеет смысл кому-либо, кроме меня, возможно ли это?
Вы могли использовать exiftool
, получить метаинформацию от jpg, png файлы. Устанавливать exiftool
, выполненный:
$ sudo apt-get install libimage-exiftool-perl
Использование: exiftool -s example.jpg
Кажется, что самая полная информация хранится как TagsList
. Это даже поддерживает иерархические теги, сохраненные Shotwell, например, nature/sky
. Теги могут быть также найдены в Subject
, Keywords
, LastKeywordXMP
поля. Subject
, Keywords
не сохраняйте иерархию тега — можно использовать их, если Вы не хотите создавать вложенные каталоги для вложенных тегов.
Вот python3
сценарий, который перемещает файлы изображений, указанные в командную строку к соответствующим каталогам тега (путем создания hardlinks и удаления исходного имени файла), например, если example.jpg
имеет список тегов: nature
, nature/clouds
, nature/mountain
, nature/sky
затем дерево каталогов результата похоже:
.
└── nature
├── clouds
│ └── example.jpg
├── example.jpg
├── mountain
│ └── example.jpg
└── sky
└── example.jpg
Примечание: всегда копируйте свои данные прежде, чем выполнить потенциально разрушительные команды (ошибки происходят):
#!/usr/bin/env python3
"""Move image files to their tag directories by creating hardlinks.
Usage: move-to-tag-dirs <image>...
"""
import json
import os
import sys
from subprocess import Popen, PIPE
TAGNAMES = ['TagsList', 'Keywords', 'Subject']
__version__ = '0.3.1'
def move_to_dirs(filename, dirs):
"""Move *filename* to *dirs* by creating hardlinks.
Create destination directories if they don't exist.
"""
for dirname in dirs:
os.makedirs(dirname, exist_ok=True)
dest_filename = os.path.join(dirname, os.path.basename(filename))
os.link(filename, dest_filename) # create hardlink
if dirs: # created at least one new link
os.unlink(filename) # remove old
if len(sys.argv) < 2:
sys.exit(__doc__) # print usage
command = ['exiftool', '-json'] + ['-' + t for t in TAGNAMES] + sys.argv[1:]
try:
process = Popen(command, stdout=PIPE, stderr=PIPE, universal_newlines=True)
except OSError as e:
sys.exit("error: can't start exiftool: " + str(e))
else:
output, errors = process.communicate()
if process.returncode != 0:
sys.exit("error: can't read tags info: exiftool exit code: %d: %s" % (
process.returncode, errors))
for metadata in json.loads(output):
# get first available tags list
dirs = next(filter(None, map(metadata.get, TAGNAMES)), [])
if isinstance(dirs, str): # single tag
dirs = [dirs]
try:
move_to_dirs(metadata['SourceFile'], dirs)
except OSError as e:
print("warning: failed to move %s to %s: %s" % (
metadata['SourceFile'], dirs, e), file=sys.stderr)
Сохраните его в названный файл move-to-tag-dirs
где-нибудь в $PATH
. Удостоверьтесь, что файл имеет исполняемые полномочия:
$ chmod +x move-to-tag-dirs
Похожие страницы: Как запустить .py программу непосредственно?
Затем для перемещения всех изображений в соответствующие каталоги тега работайте:
$ move-to-tag-dirs *.jpg *.png
Если Вы добираетесь 'Argument list too long'
ошибка затем выполняется:
$ find . -maxdepth 1 -name \*.jpg -o -name \*.png -exec move-to-tag-dirs {} +
Посмотрите Решение “mv: Список аргументов слишком долго”?
При игнорировании обработки ошибок, поддержки иерархических тегов, поддержки необычных символов в именах файлов, тегах, и т.д. затем сценарий мог быть значительно упрощен (возможно, простой одноразовый сценарий оболочки будет достаточно в этом случае).
В то время как J. F. Ответ Sebastian, вероятно, что Вы ищете, существует также основанная на теге файловая система, названная tagsistant, который могло бы стоить изучить. Можно рассматривать теги как каталоги в стандартных файловых системах и просмотреть файлы навигацией. Это помогает, если Вы имеете несколько тегов в файле и хотите искать и отсортировать для них.