使文件夹成为两个文件夹的符号链接?
我想让Ubuntu的默认音乐文件夹/home/$USER/Music
像Windows中的库一样。 基本上它将是一个包含其他文件夹内容的虚拟文件夹。
我的理由是Rhythm Box只会观看一个文件夹来播放新音乐。 我的所有音乐都位于两个文件夹/home/$USER/Dropbox/Music
和/home/$USER/Dropbox/New Music
。
这对于在Ubuntu的默认文件夹(文档,图片等)中显示其他Dropbox文件夹的内容也很有用。
我做了搜索并试图自己找到答案无济于事。 我确信有办法实现这一目标; 我只是想念它。
提前致谢。
脚本解决方案
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)
- 将脚本复制到空文件中,将其另存为
library_view.py
-
使用目标目录测试运行脚本,以第一个参数的forms查看组合目录,将源目录作为下一个参数,例如:
python3 /path/to/library_view.py /path/to/virtual_library /path/to/source1 /path/to/source2
此命令将在
virtual_library
显示文件夹source1
和source1
的内容。 -
如果一切正常,请将其添加到启动应用程序:Dash> Startup Applications> Add。 添加命令:
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
你可以为此安装unionfs-fuse
:
sudo apt-get install unionfs-fuse
安装:
unionfs-fuse /folder1=RW:/folder2=RW /mount/point
它会将folder1和folder2中的所有内容(如果需要,还可以更多)分组到挂载点
Umounting:
sudo umount /mount/point