ทำให้ Folder เป็นลิงก์สัญลักษณ์ไปยังสองโฟลเดอร์หรือไม่?


10

ฉันต้องการให้โฟลเดอร์เพลงเริ่มต้นของ Ubuntu /home/$USER/Musicทำหน้าที่เหมือนห้องสมุดใน Windows เป็นหลักมันจะเป็นโฟลเดอร์เสมือนที่มีเนื้อหาของโฟลเดอร์อื่น ๆ

เหตุผลของฉันคือ Rhythm Box จะดูโฟลเดอร์เดียวสำหรับเพลงใหม่ ทุกเพลงของฉันอยู่ในสองโฟลเดอร์และ/home/$USER/Dropbox/Music/home/$USER/Dropbox/New Music

สิ่งนี้พิสูจน์ได้ว่ามีประโยชน์ในการแสดงเนื้อหาของโฟลเดอร์ Dropbox อื่น ๆ ในโฟลเดอร์เริ่มต้นของ Ubuntu (เอกสาร, รูปภาพ, ฯลฯ )

ฉันค้นหาและพยายามหาคำตอบด้วยตัวเองโดยไม่มีประโยชน์ ฉันแน่ใจว่ามีวิธีที่จะทำให้สำเร็จ ฉันแค่คิดถึงมัน

ขอบคุณล่วงหน้า.


1
มีความสามารถในการผูก 2 โฟลเดอร์พร้อมกับ: sudo mount --bind olddir newdirแต่นี่อาจจะไม่ใช่สิ่งที่คุณเป็นหลังจาก ...
andrew.46

@ andrew.46 mount --bindอนุญาตให้เข้าถึงโฟลเดอร์หนึ่งชุดจากจุดเชื่อมต่อที่แตกต่างกันสองจุด OP ต้องการเข้าถึงโฟลเดอร์สองชุดจากจุดเมานท์เดียว
EdiD

@Edid: โอ๊ะโอคุณถูกต้องสมบูรณ์แบบ ... ขอโทษที่ได้ยินเสียง ...
andrew.46

ฉันอาจคิดวิธี แต่จะต้องมีสคริปต์พื้นหลังขนาดเล็ก นั่นจะเป็นที่ยอมรับหรือไม่?
Jacob Vlijm

@JacobVlijm โปรดอย่าบอกฉันว่าสคริปต์จะตรวจสอบว่ามีไฟล์ใดบ้างที่อยู่ในไดเรกทอรีและคัดลอกไปยังสองปลายทางหลังจากนั้น ..
heemayl

คำตอบ:


8

โซลูชันที่เขียนสคริปต์

1. มุมมองไลบรารีที่อัพเดตโดยอัตโนมัติ

ด้วยสคริปต์พื้นหลังด้านล่างคุณสามารถตั้งค่าไดเรกทอรีแสดงเนื้อหารวมของโฟลเดอร์อื่น ๆ ได้ตามต้องการ

เนื้อหาของโฟลเดอร์ (ที่มีอยู่ของ symlink) ถูกซิงโครไนซ์แบบไดนามิกกับแหล่งที่มา (รวม)

มันทำงานอย่างไร

สคริปต์แสดงรายการเนื้อหาของโฟลเดอร์ต้นทางเป็นระยะรวมถึงโฟลเดอร์เป้าหมายสำหรับ "ไลบรารี่" - ดู

  • หากมีรายการในโฟลเดอร์ต้นทางใด ๆไม่มีอยู่ในไลบรารี symlink จะถูกสร้างขึ้นในไลบรารี
  • หากมีรายการอยู่ในไลบรารีไม่มีอยู่ในโฟลเดอร์ต้นทางใด ๆ (อันที่จริงลิงก์เสีย) รายการนั้นจะถูกลบออกจากไลบรารี

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

รายการเปรียบเทียบนั้นมีน้ำหนักเบามาก (โดยทางโปรแกรม) และมีทรัพยากรเหลือน้อย ฉันทดสอบสคริปต์ด้วยลูปที่เร็วกว่ามากจากนั้นในสคริปต์ด้านล่างโดยมีรายการประมาณ 500 รายการในระดับไดเรกทอรีเดียวโดยไม่มีการโหลดเพิ่มเติมใด ๆ (สังเกตได้) ใด ๆ

สคริปต์และวิธีการใช้

#!/usr/bin/env python3
import os
import sys
import time

# --- set loop time below (or leave it as it is)
loop = 5
# ---
# don't change anything below

target = sys.argv[1]
sources = sys.argv[2:]

while True:
    currlinks = os.listdir(target)
    compare = []
    for dr in sources:
        for f in os.listdir(dr):
            compare.append(f)
            if not f in currlinks:
                # create link
                os.symlink(dr+"/"+f, target+"/"+f)
    # clean up possible broken links
    for link in currlinks:
        if not link in compare:
            os.remove(target+"/"+link)
    # loop time
    time.sleep(loop)
  1. คัดลอกสคริปต์ลงในไฟล์ว่างแล้วบันทึกเป็น library_view.py
  2. ทดสอบสคริปต์ด้วยไดเรกทอรีเป้าหมายเพื่อดูไดเรกทอรีรวมในเป็นอาร์กิวเมนต์แรกไดเรกทอรีต้นทางเป็นอาร์กิวเมนต์ถัดไปเช่น:

    python3 /path/to/library_view.py /path/to/virtual_library /path/to/source1 /path/to/source2
    

    คำสั่งนี้จะแสดงเนื้อหาของโฟลเดอร์source1และในsource2virtual_library

  3. หากใช้งานได้ดีให้เพิ่มลงในแอปพลิเคชันเริ่มต้น: Dash> แอปพลิเคชันเริ่มต้น> เพิ่ม เพิ่มคำสั่ง:

    python3 /path/to/library_view.py /path/to/virtual_library /path/to/source1 /path/to/source2
    

บันทึก

ตามที่กล่าวไว้คุณสามารถเพิ่มมากกว่าสองไดเรกทอรี soure ถ้าคุณต้องการ

2. รุ่นคู่มือ

หากคุณไม่ต้องการใช้สคริปต์พื้นหลังด้วยเหตุผลบางอย่างคุณสามารถอัปเดต (ซิงโครไนซ์) โฟลเดอร์ไลบรารีด้วยตนเองโดยใช้คำสั่งเดียวกันภายใต้คีย์ลัดโดยใช้สคริปต์ด้านล่าง:

#!/usr/bin/env python3
import os
import sys

target = sys.argv[1]
sources = sys.argv[2:]

currlinks = os.listdir(target)
compare = []
for dr in sources:
    for f in os.listdir(dr):
        compare.append(f)
        if not f in currlinks:
            # create link
            os.symlink(dr+"/"+f, target+"/"+f)
# clean up possible broken links
for link in currlinks:
    if not link in compare:
        os.remove(target+"/"+link)

เลือก: การตั้งค่าระบบ> "แป้นพิมพ์"> "ทางลัด"> "ทางลัดที่กำหนดเอง" คลิกที่ "+" และเพิ่มคำสั่ง yo คีย์ผสมที่คุณเลือก:

python3 /path/to/library_view.py /path/to/virtual_library /path/to/source1 /path/to/source2

จาค็อบฉันต้องขอบคุณจริงๆสำหรับการออกไปและเขียนสคริปต์ให้ฉัน ตอนนี้ฉันต้องใช้มันคุณทำงานแล้ว :-) ฉันจะให้ภาพนี้ในช่วงสุดสัปดาห์ ขอบคุณมาก.
DanTheManDRH

1
@ DanHutter ขอบคุณ! หวังว่าคุณจะชอบมัน หากมีสิ่งใดโปรดแจ้งให้เราทราบ
Jacob Vlijm

สวัสดีจาค็อบฉันเพิ่งอัพเกรดเป็น Ubuntu Gnome 16.10 สคริปต์นี้ยังคงทำงานได้อย่างสมบูรณ์ กำลังใช้งานมันสำหรับเพลงภาพถ่ายและเอกสาร! ขอขอบคุณอีกครั้ง.
DanTheManDRH

@ DanHutter ขอบคุณที่พูดถึงมันเป็นเรื่องที่ดีที่จะได้ยิน!
Jacob Vlijm

3

คุณสามารถติดตั้งunionfs-fuseสำหรับสิ่งนี้:

sudo apt-get install unionfs-fuse 

ติดตั้ง:

unionfs-fuse /folder1=RW:/folder2=RW /mount/point

มันจะจัดกลุ่มเนื้อหาทั้งหมดจากfolder1และfolder2 (หรือมากกว่านั้นถ้าคุณต้องการ) ไปยังจุดเชื่อมต่อของคุณ

Umounting:

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