web-dev-qa-db-ja.com

Folderを2つのフォルダーへのシンボリックリンクにしますか?

Ubuntuのデフォルトの音楽フォルダー/home/$USER/Musicを使用して、Windowsのライブラリーとほぼ同じように動作させたいと思います。基本的には、他のフォルダーのコンテンツを含む仮想フォルダーになります。

私の理論的根拠は、Rhythm Boxは新しい音楽用に1つのフォルダーのみを見るということです。私の音楽はすべて/home/$USER/Dropbox/Music/home/$USER/Dropbox/New Musicの2つのフォルダーにあります。

これは、Ubuntuのデフォルトフォルダー(ドキュメント、写真など)にある他のDropboxフォルダーの内容を表示するのにも役立ちます。

私は検索し、自分で答えを見つけようとしましたが、役に立ちませんでした。これを達成する方法があると確信しています。私はちょうどそれを見逃しています。

前もって感謝します。

9
DanTheManDRH

スクリプト化されたソリューション

1.自動更新されたライブラリビュー

以下のバックグラウンドスクリプトを使用すると、ディレクトリを設定して、任意の数の他のフォルダーの結合コンテンツを仮想的に表示できます。

フォルダのコンテンツ(シンボリックリンクが存在する)は、(結合された)ソースと動的に同期されます。

使い方

スクリプトは、ソースフォルダーのコンテンツと「ライブラリ」-viewのターゲットフォルダーを定期的にリストします。

  • ソースフォルダーのいずれかにアイテムが存在する場合、ライブラリにnotが存在する場合、ライブラリにシンボリックリンクが作成されます。
  • ライブラリにアイテムがある場合、notがソースフォルダー(実際にはリンク切れ)のいずれかに存在する場合、アイテムはライブラリから削除

enter image description here

リストの比較は非常に軽量(プログラム的に)で、リソースが少ないです。次のスクリプトよりもはるかに高速なループでスクリプトをテストしました。1つのディレクトリレベルで約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. テスト-targetedディレクトリを使用してスクリプトを実行し、最初の引数、次の引数としてのソースディレクトリ、例えば:

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

    このコマンドは、フォルダーsource1およびsource2内のvirtual_libraryの内容を表示します。

  3. すべてが正常に動作する場合は、起動アプリケーションに追加します:ダッシュ>起動アプリケーション>追加。コマンドを追加します。

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

注意

前述のように、必要に応じて3つ以上のディレクトリを追加できます。

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)

システム設定>「キーボード」>「ショートカット」>「カスタムショートカット」を選択します。 「+」をクリックして、選択したキーの組み合わせにコマンドを追加します。

python3 /path/to/library_view.py /path/to/virtual_library /path/to/source1 /path/to/source2
8
Jacob Vlijm

これにはunionfs-Fuseをインストールできます:

Sudo apt-get install unionfs-Fuse 

マウント:

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

folder1およびfolder2(または必要に応じてそれ以上)からマウントポイントまでのすべてのコンテンツをグループ化します。

マウント:

Sudo umount /mount/point
3
EdiD