使Folder成为两个文件夹的符号链接?


10

我想让Ubuntu的默认音乐文件夹/home/$USER/Music像Windows中的库一样运行。本质上,它将是一个包含其他文件夹内容的虚拟文件夹。

我的理由是Rhythm Box将只观看一个文件夹中的新音乐。我所有的音乐驻留在两个文件夹/home/$USER/Dropbox/Music/home/$USER/Dropbox/New Music

这对于在Ubuntu的默认文件夹(文档,图片等)中显示其他Dropbox文件夹的内容也很有用。

我进行了搜索,并试图独自找到答案,但无济于事。我敢肯定有办法做到这一点;我只是想念它。

提前致谢。


1
可以将2个文件夹绑定在一起:sudo mount --bind olddir newdir但是,这可能不完全是您想要的...
andrew.46 2016年

@ andrew.46 mount --bind允许从两个不同的安装点访问一组文件夹。OP希望从一个安装点访问两组文件夹
EdiD '16

@Edid:哎呀,你当然是完全正确的......对于噪声抱歉...
andrew.46

我可以考虑一种方法,但是这需要一个小的背景脚本。可以接受吗?
雅各布·弗利姆

@JacobVlijm请不要告诉我的脚本会检查是否有文件可用上的目录,并复制到两个目的地之后..
heemayl

Answers:


8

脚本解决方案

1.自动更新的库视图

使用下面的背景脚本,您可以设置目录,以虚拟方式显示任意数量其他文件夹的组合内容。

文件夹的内容(现有符号链接)与(组合的)源动态同步。

怎么运行的

该脚本会定期列出源文件夹的内容以及“库” -view的目标文件夹。

  • 如果任何源文件夹中有项目,但库中存在,则会在库中创建符号链接。
  • 如果库中有项目,任何源文件夹中都不存在(实际上是断开的链接),则将项目从库中删除

在此处输入图片说明

比较列表非常轻巧(以编程方式)并且资源很少。我在下面的脚本中以更快的循环对脚本进行了测试,在单个目录级别中包含了大约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
    

    此命令将显示source1source2中的文件夹的内容virtual_library

  3. 如果一切正常,请将其添加到启动应用程序:Dash>启动应用程序>添加。添加命令:

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

注意

如前所述,您可以根据需要添加两个以上的纯目录。

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谢谢!希望你会喜欢。如果有任何事情,请告诉我。
雅各布·弗利姆

嗨,雅各布,我刚刚升级到Ubuntu Gnome 16.10,该脚本仍然可以完美运行。当前正在将其用于音乐,照片和文档!再次感谢你。
DanTheManDRH

@DanHutter感谢您的提及,真是太好了!
雅各布·弗利姆

3

您可以unionfs-fuse为此安装:

sudo apt-get install unionfs-fuse 

安装:

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

它将组从所有内容文件夹1文件夹2(或更多,如果你想)你的挂载点

正在安装:

sudo umount /mount/point
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.