如何自动设置多个文件夹的文件夹图标?

如何自动设置多个文件夹的文件夹图标?

如何将每个文件夹的第一张图片设置为其文件夹图标?

上面链接的问题有一个答案,其中包含一个对我有用的脚本。它只需要一点改进。

它有什么作用?

它查找包含.jpg、.jpeg、.png、.gif、.icns、.ico扩展名并将它们设置为文件所在文件夹的文件夹图标。它以递归方式处理多个文件夹。基本上,它会尝试在文件夹中查找图像文件,并将找到的第一个图像设置为文件夹图标。它适用于许多场景,设置此脚本通常是我全新安装后做的第一件事(因为它很棒)。

有什么问题?

可能有几个目录包含大量图像文件,并且该目录中的第一个图像文件可能不适合作为文件夹图标。

它应该做什么?

如果它不是基于扩展名,而是基于文件名并以一个(例如folder.png)或多个(例如albumart.png cover.png)文件名为目标,那么这个问题就可以解决。

或者更好的是让两种方法在单个脚本中工作

  • 查找预定义filenames
  • 如果找到,将其设置为文件夹图标并移动到下一个文件夹
  • 如果未找到,则查找预定义扩展并将其设置为文件夹图标并移动到下一个文件夹

答案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. 编辑后的右键单击选项,用作 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/scriptsset_foldericons(无扩展名!),然后使其可执行

  3. 在脚本的开头,您可以根据需要编辑要用作有效图标图像的扩展名列表。还可以设置首选文件名列表。
  4. 注销并重新登录,即可正常工作。

如果由于某种原因你想将文件夹内的图标重置为默认图标,请使用脚本这里

相关内容