Как установить значки папок для нескольких папок автоматически?

10

Как установить первая фотография каждой папки в виде значка ее папки?

Вопрос, связанный выше, имеет ответ, состоящий из скрипта, который работает для меня. Это просто нуждается в небольшом улучшении.

Что он делает?

Он находит файлы с расширениями .jpg, .jpeg, .png, .gif, .icns, .ico и устанавливает их как значок папки в папке, в которой был найден файл. Он работает в нескольких папках, рекурсивно. В основном он пытается найти файл изображения внутри папки, и первое найденное им изображение устанавливается как значок папки. Он отлично работает для многих сценариев, и настройка этого сценария, как правило, первая вещь, которую я делаю после новой установки (потому что это потрясающе).

В чем проблема?

Может быть несколько каталогов, содержащих много файлов изображений, и первый файл изображения в этом каталоге может быть не совсем подходящим для значка папки.

Что делать?

Вместо того, чтобы быть основанным на расширении, если он стал именным и целевым (например, folder.png ) или несколькими (например, albumart.png cover.png ) именами файлов, эта проблема может быть решена.

или еще лучше, чтобы оба подхода работали в одном скрипте

  • Найти предопределенные filenames
  • Если найдено, установите его как значок папки и перейдите в следующую папку
  • Если НЕ найден, найдите предопределенное расширение и установите его как значок папки и перейдите в следующую папку
задан Sumeet Deshmukh 06.04.2017 в 12:45
источник

1 ответ

8

Я все еще могу «немного изящно», но ниже приведены отредактированные версии связанных.

В чем разница?

Я добавил предопределенный список в раздел главы:

specs = ["folder.png", "cover.png", "monkey.png"]

и я заменил:

try:
    first = min(p for p in os.listdir(folder) 
                if p.split(".")[-1].lower() in ext)
except ValueError:
    pass

:

fls = os.listdir(folder)
try:
    first = [p for p in fls if p in specs]
    first = first[0] if first else min(
        p for p in fls if p.split(".")[-1].lower() in ext
        )
except ValueError:
    pass

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

1. Базовая версия

Используется с целевым каталогом в качестве аргумента:

#!/usr/bin/env python3
import subprocess
import os
import sys

# --- set the list of valid extensions below (lowercase)
# --- use quotes, *don't* include the dot!
ext = ["jpg", "jpeg", "png", "gif", "icns", "ico"]
# --- set the list of preferred filenames
# --- use quotes
specs = ["folder.png", "cover.png", "monkey.png"]
# ---

# retrieve the path of the targeted folder
dr = sys.argv[1]

for root, dirs, files in os.walk(dr):
    for directory in dirs:
        folder = os.path.join(root, directory)
        try:
            fls = os.listdir(folder)
            first = [p for p in fls if p in specs]
            first = first[0] if first else min(
                p for p in fls if p.split(".")[-1].lower() in ext
                )
        except (ValueError, PermissionError):
            pass

        else:
            subprocess.Popen([
                "gvfs-set-attribute", "-t", "string",
                os.path.abspath(folder), "metadata::custom-icon",
                "file://"+os.path.abspath(os.path.join(folder, first))
                ])

Как использовать

  1. Скопируйте сценарий в пустой файл, сохраните его как change_icon.py
  2. В начале скрипта отредактируйте, если хотите, список расширений, которые будут использоваться в качестве допустимых изображений значков. Также укажите предпочтительный список имен файлов.
  3. Запустите его с целевым каталогом в качестве аргумента:

    python3 /path/to/change_icon.py <targeted_directory>
    

Вот и все!

2. Измененный параметр правой кнопки мыши, который будет использоваться как сценарий nautilus (щелчок правой кнопкой мыши)

#!/usr/bin/env python3
import subprocess
import os

# --- set the list of valid extensions below (lowercase)
# --- use quotes, *don't* include the dot!
ext = ["jpg", "jpeg", "png", "gif", "icns", "ico"]
# --- set the list of preferred filenames
# --- use quotes
specs = ["folder.png", "cover.png", "aap.png"]
# ---

def fix(path):
    for c in [("%23", "#"), ("%5D", "]"), ("%5E", "^"),
              ("file://", ""), ("%20", " ")]:
        path = path.replace(c[0], c[1])
    return path

# retrieve the path of the targeted folder
current = fix(os.getenv("NAUTILUS_SCRIPT_CURRENT_URI"))
dr = os.path.realpath(current)

for root, dirs, files in os.walk(dr):
    for directory in dirs:
        folder = os.path.join(root, directory)
        try:
            fls = os.listdir(folder)
            first = [p for p in fls if p in specs]
            first = first[0] if first else min(
                p for p in fls if p.split(".")[-1].lower() in ext
                )
        except (ValueError, PermissionError):
            pass

        else:
            subprocess.Popen([
                "gvfs-set-attribute", "-t", "string",
                os.path.abspath(folder), "metadata::custom-icon",
                "file://"+os.path.abspath(os.path.join(folder, first))
                ])

Чтобы использовать

  1. Создать, если он еще не существует, каталог

    ~/.local/share/nautilus/scripts
    
  2. Скопируйте сценарий в пустой файл, сохраните его в ~/.local/share/nautilus/scripts как set_foldericons (без расширения!) и сделайте его выполнимым .

  3. В начале скрипта отредактируйте, если хотите, список расширений, которые будут использоваться в качестве допустимых изображений значков. Также укажите предпочтительный список имен файлов.
  4. Выйдите из системы и вернитесь, и он работает.

Если по какой-либо причине вы хотите сбросить значки внутри папки до значков по умолчанию, используйте сценарий здесь

    
ответ дан Jacob Vlijm 23.05.2017 в 19:52
источник