Ordner zu einem symbolischen Link zu zwei Ordnern machen?


10

Ich hätte gerne Ubuntus Standard-Musikordner /home/$USER/Music, der sich so ziemlich wie eine Bibliothek in Windows verhält. Im Wesentlichen wäre es ein virtueller Ordner, der den Inhalt anderer Ordner enthält.

Mein Grundgedanke ist, dass Rhythm Box nur einen Ordner für neue Musik ansieht. Alle meine Musik befindet sich in zwei Ordnern /home/$USER/Dropbox/Musicund /home/$USER/Dropbox/New Music.

Dies ist auch nützlich, um den Inhalt anderer Dropbox-Ordner in den Standardordnern von Ubuntu (Dokumente, Bilder usw.) anzuzeigen.

Ich habe gesucht und versucht, die Antwort selbst zu finden, ohne Erfolg. Ich bin sicher, dass es einen Weg gibt, dies zu erreichen. Ich vermisse es einfach.

Danke im Voraus.


1
Es gibt die Möglichkeit, 2 Ordner zusammenzubinden mit: sudo mount --bind olddir newdiraber das ist wahrscheinlich nicht genau das, wonach Sie
suchen

@ andrew.46 mount --bindermöglicht den Zugriff auf einen Ordnersatz von zwei verschiedenen Einhängepunkten aus. OP möchte von einem Einhängepunkt aus auf zwei
Ordnersätze zugreifen

@ Edid: Ups, Sie sind natürlich vollkommen korrekt ... Entschuldigung für den Lärm ...
andrew.46

Ich könnte mir einen Weg vorstellen, aber dafür wäre ein kleines Hintergrundskript erforderlich. Wäre das akzeptabel?
Jacob Vlijm

@JacobVlijm Bitte sagen Sie mir nicht, dass das Skript prüft, ob eine Datei im Verzeichnis verfügbar ist, und anschließend an zwei Ziele
kopiert wird

Antworten:


8

Skriptlösung (en)

1. Automatisch aktualisierte Bibliotheksansicht

Mit dem folgenden Hintergrundskript können Sie ein Verzeichnis einrichten, in dem der kombinierte Inhalt einer beliebigen Anzahl anderer Ordner virtuell angezeigt wird.

Der Inhalt des Ordners (der aus Symlinks besteht) wird dynamisch mit den (kombinierten) Quellen synchronisiert.

Wie es funktioniert

Das Skript listet regelmäßig den Inhalt der Quellordner sowie den Zielordner für die "Bibliotheks" -Ansicht auf.

  • Wenn sich in einem der Quellordner Elemente befinden, die nicht in der Bibliothek vorhanden sind, wird in der Bibliothek ein Symlink erstellt.
  • wenn es Elemente in der Bibliothek sind, nicht in eines des Quellordner (eigentlich ein gebrochener Link) bestehenden, wird das Element entfernt aus der Bibliothek.

Geben Sie hier die Bildbeschreibung ein

Das Vergleichen von Listen ist (programmgesteuert) extrem leicht und ressourcenschonend. Ich habe das Skript mit einer viel schnelleren Schleife als im folgenden Skript getestet, mit einer Anzahl von Elementen von ungefähr 500 in einer einzelnen Verzeichnisebene, ohne zusätzliche (wahrnehmbare) Last.

Das Skript und wie man es benutzt

#!/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. Kopieren Sie das Skript in eine leere Datei und speichern Sie es unter library_view.py
  2. Test- führen Sie das Skript mit dem Ziel , das Verzeichnis der kombinierten Verzeichnisse in, wie zu sehen erstem Argumente , die Quellverzeichnisse als nächste Argumente, zum Beispiel:

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

    Dieser Befehl zeigt den Inhalt der Ordner source1und source2in virtual_library.

  3. Wenn alles einwandfrei funktioniert, fügen Sie es zu Startanwendungen hinzu: Dash> Startanwendungen> Hinzufügen. Fügen Sie den Befehl hinzu:

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

Hinweis

Wie bereits erwähnt, können Sie bei Bedarf mehr als zwei Soure-Verzeichnisse hinzufügen.

2. Manuelle Version

Wenn Sie aus irgendeinem Grund kein Hintergrundskript verwenden möchten, können Sie den Bibliotheksordner mit genau demselben Befehl unter einer Tastenkombination mithilfe des folgenden Skripts manuell aktualisieren (synchronisieren):

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

Wählen Sie: Systemeinstellungen> "Tastatur"> "Verknüpfungen"> "Benutzerdefinierte Verknüpfungen". Klicken Sie auf das "+" und fügen Sie den Befehl zu einer Tastenkombination Ihrer Wahl hinzu:

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

Jacob, ich muss dir wirklich dafür danken, dass du alles getan hast und ein Drehbuch für mich geschrieben hast. Jetzt muss ich es benutzen, du hast die Arbeit gemacht. :-). Ich werde es über das Wochenende versuchen. Danke vielmals.
DanTheManDRH

1
@ DanHutter Danke! Hoffe es wird dir gefallen. Wenn es etwas gibt, lass es mich wissen.
Jacob Vlijm

Hallo Jacob, ich habe gerade ein Upgrade auf Ubuntu Gnome 16.10 durchgeführt. Dieses Skript funktioniert immer noch perfekt. Derzeit wird es für Musik, Fotos und Dokumente verwendet! Danke nochmal.
DanTheManDRH

@ DanHutter Danke fürs Erwähnen, das ist so gut zu hören!
Jacob Vlijm

3

Sie können dafür installieren unionfs-fuse:

sudo apt-get install unionfs-fuse 

Montage:

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

Es gruppiert den gesamten Inhalt von Ordner1 und Ordner2 (oder mehr, wenn Sie möchten) zu Ihrem Einhängepunkt

Umounting:

sudo umount /mount/point
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.