ฉันจะทำให้ไอคอนเดสก์ท็อปถูกจัดระเบียบและเรียงลำดับตามชื่อได้อย่างไร


8

ฉันต้องการจัดระเบียบเดสก์ท็อปของฉันตามชื่อเสมอ ฉันจะบรรลุสิ่งนี้ได้อย่างไร

เดสก์ท็อปไม่ได้จัดระเบียบตามชื่อ:

ป้อนคำอธิบายรูปภาพที่นี่

เดสก์ท็อปหลังจากจัดระเบียบตามชื่อ:

ป้อนคำอธิบายรูปภาพที่นี่


หากคุณจางหายไปชื่อที่เราไม่สามารถมองเห็นสิ่งที่เป็นกฎขององค์กร :)
จาค็อบ Vlijm

@JacobVlijm ดูเหมือนว่ากฎองค์กรของเขาคือการเรียงลำดับ dirs ก่อนแล้วจึงไฟล์ เราอาจคาดเดาได้ว่ามันเป็นตัวอักษร
Sergiy Kolodyazhnyy

สวัสดี orschiro คนไหนของสองคนนี้: chat.stackexchange.com/transcript/message/30927193#30927193
Jacob Vlijm

ขออภัยในข้อมูลที่ขาดหายไป! เดสก์ท็อปถูกจัดเรียงตามตัวอักษรเริ่มต้นด้วยโฟลเดอร์จาก A ถึง Z จากนั้นตามด้วยไฟล์ ข้อมูลนั้นเพียงพอหรือไม่
orschiro

คำตอบ:


9

จัดเรียงไอคอนเดสก์ท็อปตามตัวอักษรโดยคำสั่ง

สคริปต์ด้านล่างจะจัดเรียงเดสก์ท็อปใหม่เช่น:

ป้อนคำอธิบายรูปภาพที่นี่

... เข้าสู่เดสก์ท็อปที่เรียงลำดับตัวอักษรเช่น:

ป้อนคำอธิบายรูปภาพที่นี่

สั่งซื้อ:

  • ไดเรกทอรีก่อนจากนั้นไฟล์
  • จากบนลงล่างจากซ้ายไปขวา

กำหนดจำนวนรายการในแนวตั้ง

นอกจากนี้คุณสามารถกำหนดจำนวนรายการตามแนวตั้ง (แถว) ได้เอง ระยะห่างแนวนอนจะถูกตั้งค่าโดยอัตโนมัติ

สคริปต์

#!/usr/bin/env python3
import subprocess
import os
import math
import time

# set the size of the squares (indirectly, by setting n- rows)
rows = 10
# set x/y offset of the matrix if you want
x_offs = -15
y_offs = -30

def get(cmd):
    return subprocess.check_output(cmd).decode("utf-8")

dt = get(["xdg-user-dir",  "DESKTOP"]).strip()         
# find size of the left screen
left = [int(n) for n in sum(
    [s.split("+")[0].split("x") for s in \
     get("xrandr").split() if "+0+" in s], [])]

# size of the squares (icon area)
sqr = int((left[1]/rows))

# number of cols, squares
cols = math.floor(left[0]/sqr)
n_sqrs = cols*rows

# define positions (matrix)
pos = list([[
    str(int((math.floor(n/rows)*sqr)+(sqr/2)+x_offs)),
    str(int(((n%rows)*sqr)+(sqr/2)+y_offs)),
    ] for n in range(n_sqrs)])

# list iconfiles, split into dirs and files, sort & combine
iconlist = [os.path.join(dt, item) for item in \
            sorted([item for item in os.listdir(dt) if not "~" in item])]
dirs = []; files = []
for it in iconlist:
    if os.path.isfile(it):
        files.append(it)
    else:
        dirs.append(it)
iconlist = dirs+files
# place icons in position(s)
for i, item in enumerate(iconlist):
    location = (",").join(pos[i])
    subprocess.call(["gvfs-set-attribute", "-t", "string", item,
                       'metadata::nautilus-icon-position', location])
# simulate F5 to refresh desktop, retry for max 20 secs if not in front
t = 0
while t < 40:
    w_id = [l.split()[-1] for l in get(["xprop", "-root"]).splitlines() \
        if "_NET_ACTIVE_WINDOW(WINDOW):" in l][0]
    if "desktop" in get(["xprop", "-id", w_id, "WM_CLASS"]):
        subprocess.Popen(["xdotool", "key", "F5"])
        break
    else:
        time.sleep(0.5)
        t += 1

วิธีใช้

  1. สคริปต์ต้องการxdotool:

      sudo apt-get install xdotool
  2. คัดลอกสคริปต์ไปยังไฟล์เปล่าบันทึกเป็น arrange_dt.py

  3. ทดสอบโดยใช้คำสั่ง:

    python3 /path/to/arrange_dt.py

    ภายใน 20 วินาทีคลิกบนเดสก์ท็อปการจัดเรียงใหม่ของคุณจะถูกนำไปใช้ หากคุณเรียกใช้สคริปต์จากทางลัดในขณะที่เดสก์ท็อปอยู่ด้านหน้าการจัดเรียงจะถูกนำไปใช้ทันที หากเดสก์ท็อปอยู่ข้างหน้าสคริปต์จะรอไม่เกิน 20 วินาที หากเกินเวลาเพียงกดF5เพื่อสมัคร

  4. หากใช้งานได้ดีให้เพิ่มลงในคีย์ลัด: เลือก: การตั้งค่าระบบ> "คีย์บอร์ด"> "ทางลัด"> "ทางลัดที่กำหนดเอง" คลิกที่ "+" และเพิ่มคำสั่ง:

    python3 /path/to/arrange_dt.py

ตัวเลือก

คุณสามารถมีอิทธิพลต่อการจัดเรียงไอคอนได้สามวิธี:

  1. กำหนดขนาดของ "ไทล์"

    # set the size of the squares (indirectly, by setting n- rows)
    rows = 10

    สิ่งนี้จะกำหนดจำนวนไอคอน (สูงสุด) ในแนวตั้ง ขนาดของ "กระเบื้อง" จะเป็นเท่ากับ (x, y)

  2. ตั้งค่าการชดเชยแนวนอน

    x_offs = -15 

    สิ่งนี้จะตั้งค่าความเบี่ยงเบนจากตำแหน่งเริ่มต้นของไอคอนเมทริกซ์โดยรวม

  3. ตั้งค่าชดเชยแนวตั้ง

    y_offs = -30

    สิ่งนี้จะตั้งค่าความเบี่ยงเบนจากตำแหน่งเริ่มต้นของไอคอนเมทริกซ์

    ตัวอย่างการใช้:

    # set the size of the squares (indirectly, by setting n- rows)
    rows = 6
    # set x/y offset of the matrix if you want
    x_offs = 50
    y_offs = 10

    ป้อนคำอธิบายรูปภาพที่นี่

คำอธิบาย

คำอธิบายด้านล่างส่วนใหญ่เป็นคำอธิบายเกี่ยวกับแนวคิดมากกว่าการเข้ารหัส

  • การวางตำแหน่งไอคอนแถบสีเทาเรารายการแรกรายการในสก์ท็อปที่ใช้python'sos.listdir(Desktop)
  • จากนั้นเราแบ่งไฟล์ออกเป็นสองรายการย่อย ไฟล์ / โฟลเดอร์และเรียงลำดับรายการทั้งสองเข้าร่วมอีกครั้งโฟลเดอร์ก่อน
  • จากนั้นเราสร้างเมทริกซ์:

    • เนื่องจากจำนวนแถวถูกกำหนดไว้ที่ส่วนหัวของสคริปต์เราจึงแบ่งความสูงของหน้าจอตามจำนวนแถว ดังนั้นเราจึงมีขนาดของ "กำลังสอง" ไอคอนจะถูกวางใน (กึ่งกลาง)
    • เนื่องจากไอคอนมีระยะห่างใกล้เคียงกันในแนวนอนเราจึงสามารถคำนวณจำนวนคอลัมน์สูงสุดโดยการหารความกว้างของหน้าจอด้วยความกว้างของ "กำลังสอง" ที่ไอคอนจะถูกวาง (ต่อไอคอน), ปัดลงไปที่ จำนวนเต็มแรกด้านล่าง
    • ในภาพด้านล่างจะเห็นสี่เหลี่ยม "เสมือน" เหล่านี้จุดสีแดงคือตำแหน่งที่วางไอคอน

      ป้อนคำอธิบายรูปภาพที่นี่

    • สิ่งที่เราต้องทำคือวางไอคอนแรกครึ่งหนึ่งของขนาดของสี่เหลี่ยมจัตุรัสทั้งแนวนอนและแนวตั้ง

    • ในการค้นหาตำแหน่งxของไอคอนอื่น ๆ ทั้งหมดเราเพียงแค่ต้องแบ่งดัชนีของพวกเขา(เริ่มต้นด้วยศูนย์) ด้วยจำนวนแถวที่ปัดเศษลง ผลลัพธ์จะถูกเพิ่มในตำแหน่ง x ของไอคอนแรก (ซ้ายบน) ตัวอย่างเช่น:

      item 10 (index 9): 9/4 = 2,25, rounded down: 2
      x position = position of icon 0 + 2 x the width of a square
      
      item 17 (index 16): 16/4 = 4, rounded down: 4
      x position = position of icon 0 + 4 x the width of a square
    • ในการค้นหาตำแหน่งyของไอคอนอื่น ๆ ทั้งหมดเราเพียงต้องการส่วนที่เหลือของดัชนีและจำนวนแถว ผลลัพธ์ x ความกว้างของช่องสี่เหลี่ยมจะถูกเพิ่มไปยังตำแหน่ง y ของไอคอนแรก (ซ้ายบน) ตัวอย่างเช่น:

      item 10 (index 9): 9%4 = 1
      y position = position of icon 0 + 1 x the height of a square
      
      item 17 (index 16): 16%4 = 0
      y position = position of icon 0 + 0 x the height of a square
  • ต่อจากนั้นเราวางไอคอนบนเดสก์ท็อปโดยใช้คำสั่ง:

    gvfs-set-attribute <path_to_dir_or_file> metadata::nautilus-icon-position x,y
  • ในที่สุดเราต้องกดF5 กับเดสก์ท็อปด้านหน้าเพื่อใช้เค้าโครงที่เปลี่ยนแปลง (รีเฟรชเดสก์ทอป) หากเป็นเช่นนั้นจะเกิดขึ้นทันที หากไม่ใช้งานสคริปต์จะลองใหม่ในช่วง 20 วินาทีหากเดสก์ท็อปอยู่ข้างหน้าแล้วกดF5และหยุดพัก ถ้าหลังจาก 20 วินาทีเดสก์ทอปยังคงF5ไม่ได้อยู่ในหน้าคุณจะต้องกดด้วยตนเอง


เป็นสคริปต์ที่ยอดเยี่ยมและหลากหลาย ขอบคุณมากจาค็อบ! :-)
orschiro

@orschiro เป็นเสมอคำถามของคุณจะสร้างแรงบันดาลใจอย่างใดและที่ดีในการทำงานเกี่ยวกับ :)
จาค็อบ Vlijm

ฉันเพิ่งเจอสิ่งที่ฉันคิดว่าควรจะเป็นพฤติกรรมเริ่มต้นใน Ubuntu มีความสุขที่ได้เห็นมีคนที่มีฝีมืออย่างมากที่จะทำให้ความจริงนี้
orschiro

เฮ้จาค็อบฉันใช้ค่าต่าง ๆ6 -50 -50แต่สามโฟลเดอร์จะถูกชดเชยเล็กน้อย ความคิดใดทำไม สกรีนช็อต
orschiro

สวัสดี @orschiro นั่นเป็นเพราะความแตกต่างของความกว้างของชื่อโฟลเดอร์ หากคำสั่งไม่สามารถดำเนินการได้เพราะสิ่งนั้นมันจะเป็นตัวเลือกแรกที่เป็นไปได้ ดีกว่าไม่ได้ตั้งค่าชดเชย :) เชิงลบมากเกินไป
จาค็อบ Vlijm

0

ส่วนหนึ่งได้รับแรงบันดาลใจจากคำถามข้างต้นฉันเขียนiconicเพื่อแก้ปัญหานี้โดยให้คุณเรียงไอคอนได้สี่วิธี นอกจากนี้มันจะ:

  • กำหนดไอคอนกริดไปยังพื้นที่ใกล้ ๆ หรือแยกออกจากกัน
  • บันทึกไอคอนการตั้งค่าเดสก์ท็อปและเรียกคืนในภายหลังสำหรับการตั้งค่าที่บ้านและที่ทำงานที่แตกต่างกัน
  • อนุญาตให้คุณย้ายไอคอนไปยังหนึ่งในสามของจอภาพ
  • ไม่ต้องทนทุกข์กับ "lost icon syndrome" ที่เกิดขึ้นเมื่อใช้มอนิเตอร์หลาย ๆ ความละเอียด
  • เรียงไอคอนตามลำดับตัวอักษรตามลำดับตัวอักษรด้วย "Link to" คำนำหน้าละเว้นโดยเรียงลำดับตามวันที่แก้ไขจากน้อยไปมากหรือจากมากไปน้อย
  • อนุญาตให้ใช้ขนาดกริดที่แตกต่างกัน (คอลัมน์ x แถว) ขึ้นอยู่กับจอภาพ EG ในจอภาพ 4K มากกว่าจอภาพ 2K
  • ปุ่มทดสอบทันทีสำหรับการทดลองอย่างรวดเร็วในการเปลี่ยนแถวคอลัมน์ x หรือการเปลี่ยนแปลงพื้นที่สงวนสำหรับจอภาพซ้ายพื้นที่ด้านบนขวาหรือล่าง
  • ปุ่มทดสอบจะมีอายุการใช้งาน x วินาทีที่คุณกำหนดล้างหน้าต่างทั้งหมดก่อนการทดสอบและเรียกคืนหลังจากการทดสอบ
  • Bash script เพื่อการปรับเปลี่ยนที่ง่ายดาย

คุณจะได้รับสคริปต์บนGitHub

นี่คือหน้าจอหลัก:

iconic main menu.png

เยี่ยมชมหน้าGitHubสำหรับสัญลักษณ์เพื่อดูหน้าจออื่น ๆ ทั้งหมดคำอธิบายและสำเนาของสคริปต์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.