web-dev-qa-db-ja.com

複数のフォルダーのフォルダーアイコンを自動的に設定する方法

すべてのフォルダーの最初の画像をフォルダーアイコンとして設定する方法

上記のリンクされた質問には、私のために働いているスクリプトから成る答えがあります。少し改善が必要です。

それは何をするためのものか?

。jpg、.jpeg、.png、.gif、.icns、.ico拡張子を持つファイルを検索し、それらをフォルダーのフォルダーアイコンとして設定します。ファイルが見つかった場所。複数のフォルダーで再帰的に機能します。基本的に、フォルダ内の画像ファイルを見つけようとし、最初に見つかった画像はフォルダアイコンとして設定されます。それは多くのシナリオでうまく機能し、このスクリプトのセットアップは通常、新規インストール後に最初に行うことです(驚くばかりだからです)。

どうしたの?

多くの画像ファイルを含むいくつかのディレクトリがあり、そのディレクトリ内の最初の画像ファイルはフォルダアイコンに適していない可能性があります。

それは何をすべきですか?

拡張子ベースではなく、ファイル名ベースになり、1つ(例:folder.png)または複数(例:albumart.pngcover.png)のファイル名をターゲットにした場合、この問題は解決できます。

それとも、両方のアプローチを単一のスクリプトで動作させる

  • 事前定義済みfilenamesを検索
  • 見つかった場合は、フォルダアイコンとして設定し、次のフォルダに移動します
  • 見つからない場合は、定義済みの拡張子を見つけてフォルダーアイコンとして設定し、次のフォルダーに移動します
10
Sumeet Deshmukh

私はまだ「少し上品」かもしれませんが、以下はリンクされたものの編集されたバージョンです。

違いはなんですか?

事前定義リストをヘッドセクションに追加しました。

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/scriptsset_foldericons(拡張子なし!)として保存し、実行可能にします

  3. スクリプトの先頭で、必要に応じて、有効なアイコン画像として使用される拡張機能のリストを編集します。また、ファイル名の優先リストを設定します。
  4. ログアウトして再度ログインすると、動作します。

何らかの理由でフォルダ内のアイコンをデフォルトのアイコンにリセットする場合は、スクリプト here を使用します

8
Jacob Vlijm