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


10

すべてのフォルダの最初の画像をフォルダアイコンとして設定するにはどうすればよいですか?

上記にリンクされた質問には、私のために機能しているスクリプトを含む回答があります。少し改善が必要です。

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

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

どうしたの?

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

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

拡張子ベースではなく、ファイル名ベースになり、1つ(たとえばfolder.png)または複数(たとえばalbumart.png cover.png)のファイル名を対象とした場合、この問題は解決できます。

またはより良いまだ両方のアプローチを単一のスクリプトで機能させる

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

回答:


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

スクリプトは最初にリスト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/scriptsとして保存し、実行可能にしますset_foldericons

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

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


2
NautilusからのURIが実際にで始まることを確認する必要がありfile://ます。代わりに、replace("%20", " ")適切なURIデコード(例urllib.parse.unquote)と後でエンコード(urllib.parse.quote)を使用する必要があります。
David Foerster

@DavidFoersterはスクリプトのパフォーマンスを向上させるつもりですか?私はに変更しようとしsubprocess.Popenましたsubprocess.callが、ほぼ700以上のサブを含む巨大なディレクトリでは、すべてのフォルダアイコンが変更されるわけではありません。
Sumeet Deshmukh 2017

@DavidFoersterありがとう!しかしurllib.parse.quote、スクリプトではなく、「ドライ」テストで問題なく機能します。理由を調べる必要がありますが、今のところ、作業バージョンのスクリプトは残しておきます。
Jacob Vlijm

@SumeetDeshmukh:いいえ、ただし、スペース文字(U + 0020)のほかに他の「特殊」文字を含むURLでスクリプトを機能させることになります。さらに、誤った入力や偽の入力に対してより堅牢になり、早い段階で検出されます。
David Foerster

@JacobVlijm:スクリプトで使用しようとするとどうなりますか?エラーメッセージ?予期しない結果ですか?いunquote期待通りの仕事を?
デビッドFoerster
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.