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


10

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

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

它有什么作用?

它查找带有.jpg,.jpeg,.png,.gif,.icns,.ico扩展名的文件,并将其设置为在其中找到文件的文件夹的文件夹图标。它可以递归处理多个文件夹。基本上,它尝试在文件夹内查找图像文件,并将找到的第一个图像设置为文件夹图标。它在许多情况下都非常有效,并且设置脚本通常是我全新安装后要做的第一件事(因为它很棒)。

有什么问题?

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

应该怎么办?

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

或更妙的是使两种方法都在一个脚本中起作用

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

Answers:


9

我可能仍然会“优雅一点”,但是下面是链接版本的编辑版本。

有什么不同?

我在头部分添加了预定义列表:

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

因此,脚本首先尝试在list中查找(文件)匹配项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/scriptsset_foldericons(无扩展名!),然后使其可执行

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

如果出于某种原因想要将文件夹中的图标重置为其默认图标,请在此处使用脚本


2
您应该验证Nautilus的URI实际上以开头file://。相反,replace("%20", " ")您应该使用适当的URI解码(例如urllib.parse.unquote)和更高版本的编码(urllib.parse.quote)。
大卫·佛斯特

@DavidFoerster是否会提高脚本的性能?我试图更改subprocess.Popensubprocess.call目录,但在具有近700多个子目录的巨大目录中,并非所有文件夹图标都会更改。
Sumeet Deshmukh

@DavidFoerster谢谢!但urllib.parse.quote可以在“干式”测试中正常运行,而不是在脚本中。需要找出原因,但暂时不要使用脚本的工作版本。
雅各布·弗利姆

@SumeetDeshmukh:否,但是它将使脚本可以使用包含空格字符(U + 0020)之外的其他“特殊”字符的URL。此外,它可以更强大地防止错误或虚假的输入,并尽早发现它。
大卫·佛斯特

@JacobVlijm:当您尝试在脚本中使用它时会发生什么?错误信息?出乎意料的结果?是否unquote按预期工作?
大卫·佛斯特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.