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

19

Если в папке A, B, C ..... Z есть изображения, как я могу автоматически установить первое изображение в каждой из этих папок в качестве значка своей папки? Есть ли способ, как скрипт или что-то еще?

    
задан JulianLai 08.07.2016 в 09:34
источник

1 ответ

27

1. Автоматически менять значок папки на первое найденное изображение внутри

Ниже приведенный ниже сценарий python изменит значок всех папок внутри каталога (рекурсивно) в first , где будет найден правильный файл изображения внутри папки.

Скрипт

#!/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"]
# ---

dr = sys.argv[1]

for root, dirs, files in os.walk(dr):
    for directory in dirs:
        folder = os.path.join(root, directory)
        try:
            first = min(p for p in os.listdir(folder) 
                        if p.split(".")[-1].lower() in ext)
        except ValueError:
            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))
                  ])

Загрузка с Pastebin

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

  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"]
# ---

# retrieve the path of the targeted folder
current = os.getenv("NAUTILUS_SCRIPT_CURRENT_URI").replace("file://", "").replace("%20", " ")
dr = os.path.realpath(current)

for root, dirs, files in os.walk(dr):
    for directory in dirs:
        folder = os.path.join(root, directory)
        try:
            first = min(p for p in os.listdir(folder) 
                        if p.split(".")[-1].lower() in ext)
        except ValueError:
            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))
                  ])

Загрузка с Pastebin

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

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

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

  3. Выйдите из системы и вернитесь, он работает.

Примечания

  • Это приведет к изменению значка всех папок внутри правой кнопкой мыши, а не самой папки.
  • Так как используется os.path.realpath() , это также работает, если целевая папка является ссылкой.

ИЗМЕНИТЬ

Отменить (сбросить) пользовательские значки внутри каталога рекурсивно

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

  • скопируйте его в пустой файл, сохраните его как reset_icons.py
  • запустите его командой:

    python3 /path/to/reset_icons.py <target_directory>
    

Скрипт

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

dr = sys.argv[1]

for root, dirs, files in os.walk(dr):
    for directory in dirs:
        folder = os.path.join(root, directory)
        subprocess.Popen([
            "gvfs-set-attribute", os.path.abspath(folder),
            "-t", "unset", "metadata::custom-icon"
            ])
    
ответ дан Jacob Vlijm 08.07.2016 в 10:42
источник