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

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

Вопрос, связанный выше, имеет ответ, состоящий сценарий, который работал на меня. Просто требуется немного улучшения.

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

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

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

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

Что это должно сделать?

Вместо того, чтобы быть базирующимся расширением, если это стало базирующимся именем файла и предназначалось для одного (например, folder.png) или несколько (например, albumart.png cover.png) имена файлов затем эта проблема могли быть решены.

или еще лучше заставьте оба подхода работать в единственном сценарии

  • Найдите предопределенными filenames
  • Если найдено установленный это как значок папки и перемещение к следующей папке
  • Если НЕ найденный затем находят предопределенное расширение и устанавливают его как значок папки и перемещаются в следующую папку
10
задан 24 May 2017 в 12:38

1 ответ

Я мог бы все еще, "изящный это немного", но ниже являются отредактированные версии связанных.

Каково различие?

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

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. Отредактированная опция щелчка правой кнопкой, чтобы использоваться в качестве наутилуса (щелкают правой кнопкой) по сценарию

#!/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. Выйдите из системы и въезжайте задним ходом, и это работает.

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

8
ответ дан 23 November 2019 в 04:35

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

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