여러 폴더의 폴더 아이콘을 자동으로 설정하는 방법은 무엇입니까?


10

모든 폴더의 첫 번째 그림을 폴더 아이콘으로 설정하는 방법은 무엇입니까?

위에 링크 된 질문에는 나를 위해 일한 스크립트로 구성된 답변이 있습니다. 약간의 개선이 필요합니다.

무엇을합니까?

.jpg, .jpeg, .png, .gif, .icns, .ico 확장자를 가진 파일을 찾아서 파일을 찾은 폴더의 폴더 아이콘으로 설정합니다. 여러 폴더에서 재귀 적으로 작동합니다. 기본적으로 폴더 내에서 이미지 파일을 찾으려고 시도하는 첫 번째 이미지는 폴더 아이콘으로 설정됩니다. 많은 시나리오에서 효과적이며,이 스크립트를 설정하는 것은 일반적으로 새로 설치 한 후 처음으로하는 일입니다 (놀라기 때문에).

뭐가 문제 야?

많은 이미지 파일을 포함하는 디렉토리가 몇 개있을 수 있으며 해당 디렉토리의 첫 번째 이미지 파일은 폴더 아이콘으로 적합하지 않을 수 있습니다.

어떻게해야합니까?

확장자 기반이 아니라 파일 이름 기반이되어 하나 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

따라서 스크립트는 먼저 list에서 (file) 일치 항목을 찾으려고 시도합니다 ( 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/scripts으로 저장 한 다음 실행 가능하게 만드십시오 .set_foldericons

  3. 스크립트 헤드에서 원하는 경우 유효한 아이콘 이미지로 사용할 확장자 목록을 편집하십시오. 또한 선호하는 파일 이름 목록을 설정하십시오.
  4. 로그 아웃했다가 다시 로그인하면 작동합니다.

어떤 이유로 폴더 안의 아이콘을 기본 아이콘으로 재설정하려면 여기에 있는 스크립트를 사용 하십시오


2
노틸러스의 URI가 실제로로 시작하는지 확인해야합니다 file://. 대신 replace("%20", " ")적절한 URI 디코딩 (예 :) urllib.parse.unquote및 이후 인코딩 ( urllib.parse.quote) 을 사용해야합니다 .
David Foerster

@DavidFoerster이 스크립트의 성능을 향상시킬 것입니까? 나는 변경 시도 subprocess.Popensubprocess.call거의 700 하위의 모든 폴더 아이콘 chnage에 있지만 큰 디렉토리에.
Sumeet Deshmukh

@DavidFoerster 감사합니다! 하지만 urllib.parse.quote하지 스크립트에서는, "건조"테스트에서 잘 작동합니다. 이유를 찾아야하지만 지금은 작동하는 스크립트 버전을 남겨 두어야합니다.
Jacob Vlijm

@SumeetDeshmukh : 아니요. 그러나 공백 문자 (U + 0020) 외에 다른 "특수"문자가 포함 된 URL을 사용하여 스크립트를 작동시킬 것입니다. 또한 잘못되거나 가짜 입력에 대해 더 강력 해져서 일찍 잡을 수 있습니다.
David Foerster 17 년

@JacobVlijm : 스크립트에서 사용하려고하면 어떻게됩니까? 에러 메시지? 예기치 않은 결과? unquote예상대로 작동 합니까 ?
David Foerster 17 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.