Bagaimana cara mengatur ikon folder beberapa folder secara otomatis?

10

Bagaimana cara mengatur gambar pertama dari setiap folder sebagai ikon foldernya?

Pertanyaan yang ditautkan di atas memiliki jawaban yang terdiri atas skrip yang telah berfungsi untuk saya. Itu hanya perlu sedikit perbaikan.

Apa fungsinya?

Ia menemukan file dengan ekstensi .jpg, .jpeg, .png, .gif, .icns, .ico dan menetapkannya sebagai ikon folder folder di mana file itu ditemukan. Ini berfungsi pada banyak folder, secara rekursif. Pada dasarnya ia mencoba untuk menemukan file gambar di dalam folder, dan gambar pertama yang ditemukannya ditetapkan sebagai ikon folder. Ini berfungsi dengan baik untuk banyak skenario, dan mengatur skrip ini biasanya adalah hal pertama yang saya lakukan setelah instalasi baru (karena ini luar biasa).

Apa masalahnya?

Mungkin ada beberapa direktori yang berisi banyak file gambar dan file gambar pertama dalam direktori itu mungkin tidak cocok untuk menjadi ikon folder.

Apa yang harus dilakukan?

Alih-alih berbasis ekstensi, jika itu menjadi nama file dan ditargetkan satu (misalnya, folder.png) atau beberapa (misalnya albumart.png cover.png) nama file maka masalah ini dapat diselesaikan.

atau lebih baik lagi membuat kedua pendekatan bekerja dalam satu skrip

  • Temukan yang telah ditentukan filenames
  • Jika ditemukan atur sebagai ikon folder dan pindah ke folder berikutnya
  • Jika TIDAK ditemukan, cari ekstensi yang telah ditentukan dan atur sebagai ikon folder dan pindah ke folder berikutnya
Sumeet Deshmukh
sumber
Mari kita lanjutkan diskusi ini dalam obrolan .
Sumeet Deshmukh

Jawaban:

9

Saya mungkin masih "sedikit elegan" tetapi di bawah ini adalah versi yang diedit dari yang tertaut.

Apa bedanya?

Saya menambahkan daftar yang sudah ditentukan ke bagian kepala:

specs = ["folder.png", "cover.png", "monkey.png"]

dan saya diganti:

try:
    first = min(p for p in os.listdir(folder) 
                if p.split(".")[-1].lower() in ext)
except ValueError:
    pass

oleh:

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

sehingga skrip pertama-tama mencoba menemukan (file) yang cocok dalam daftar specs, (hanya) jika tidak ada, ia melompat ke mencari ekstensi yang cocok, dan melakukan trik jika menemukan gambar yang cocok.


1. Versi dasar

Untuk digunakan dengan direktori yang ditargetkan sebagai argumen:

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

Cara Penggunaan

  1. Salin skrip ke file kosong, simpan sebagai change_icon.py
  2. Di bagian atas skrip, edit, jika Anda mau, daftar ekstensi yang akan digunakan sebagai gambar ikon yang valid. Juga atur daftar nama file yang disukai.
  3. Jalankan dengan direktori yang ditargetkan sebagai argumen:

    python3 /path/to/change_icon.py <targeted_directory>
    

Itu dia!


2. Opsi klik kanan yang diedit, untuk digunakan sebagai skrip nautilus (klik kanan)

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

Menggunakan

  1. Buat, jika belum ada, direktori

    ~/.local/share/nautilus/scripts
    
  2. Salin skrip ke file kosong, simpan ~/.local/share/nautilus/scriptssebagai set_foldericons(tidak ada ekstensi!), Dan membuatnya dapat dieksekusi .

  3. Di bagian atas skrip, edit, jika Anda mau, daftar ekstensi yang akan digunakan sebagai gambar ikon yang valid. Juga atur daftar nama file yang disukai.
  4. Logout dan kembali, dan berfungsi.

Jika, karena alasan tertentu Anda ingin mengatur ulang ikon di dalam folder ke ikon default, gunakan skrip di sini

Yakub Vlijm
sumber
2
Anda harus memverifikasi bahwa URI dari Nautilus sebenarnya dimulai dengan file://. Alih-alih, replace("%20", " ")Anda harus menggunakan pengodean URI yang tepat (mis. urllib.parse.unquote) Dan pengodean yang lebih baru ( urllib.parse.quote).
David Foerster
@ DavidFoerster apakah ini akan meningkatkan kinerja skrip? Aku mencoba untuk mengubah subprocess.Popenke subprocess.calltapi pada direktori besar dengan hampir 700 + sub ini tidak semua ikon folder chnage.
Sumeet Deshmukh
@ DavidFoerster terima kasih! tetapi urllib.parse.quotebekerja dengan baik pada tes "kering", tidak dalam skrip. Perlu mencari tahu mengapa, tetapi meninggalkan versi skrip yang berfungsi untuk saat ini.
Jacob Vlijm
@SumeetDeshmukh: Tidak, tapi ini akan membuat skrip berfungsi dengan URL yang berisi karakter "spesial" lainnya selain karakter spasi (U + 0020). Selain itu akan menjadi lebih kuat terhadap input yang salah atau palsu dan menangkapnya sejak dini.
David Foerster
@JacobVlijm: Apa yang terjadi ketika Anda mencoba menggunakannya dalam skrip? Pesan eror? Hasil yang tidak terduga? Apakah unquotebekerja seperti yang diharapkan?
David Foerster