Могу ли я использовать терминал для перемещения изображений в определенные каталоги с помощью тега images?

У меня есть огромная папка изображений, которые я собрал за годы, которые мои студенты используют для курсовой работы. Началось с примерно двадцати изображений, так что я не особо задумывался об именах файлов или какой-либо структуре, просто помечал их и вставлял в них. В той же папке сейчас находится около 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

Предполагая, что имеет смысл кому-либо, кроме меня, возможно ли это?

2
задан 24 April 2016 в 14:06

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: Список аргументов слишком долго”?

При игнорировании обработки ошибок, поддержки иерархических тегов, поддержки необычных символов в именах файлов, тегах, и т.д. затем сценарий мог быть значительно упрощен (возможно, простой одноразовый сценарий оболочки будет достаточно в этом случае).

4
ответ дан 25 April 2016 в 00:06
  • 1
    можно ли помочь мне петлять. I' ll дают Вам файл. Я получил некоторую ошибку во время продолжительности. – Ayu 16 September 2017 в 02:46

В то время как J. F. Ответ Sebastian, вероятно, что Вы ищете, существует также основанная на теге файловая система, названная tagsistant, который могло бы стоить изучить. Можно рассматривать теги как каталоги в стандартных файловых системах и просмотреть файлы навигацией. Это помогает, если Вы имеете несколько тегов в файле и хотите искать и отсортировать для них.

0
ответ дан 25 April 2016 в 00:06

Другие вопросы по тегам:

Похожие вопросы: