出于组织目的,我希望某个文件系统对象大多数时候显示为文件,有时显示为目录。
基本思想是,一般来说,对于cp
, mv
, find
, updatedb
/ locate
,我希望该对象显示为单独的文件。对于其他应用程序,例如vlc
、rythmbox
、feh
和okular
,我希望它显示为目录。有人可以建议一种机制来做到这一点吗?
为了说明这一点,我举个例子:
我将给我想到的对象命名为 _my_books_on_m4_programming.arch_。出于移动/复制或查找/定位的目的,该对象看起来像一个文件,但是当我想在该对象中阅读一本书时,它看起来像一个目录,即:对于命令okular my_books_on_m4_programming.arch/beginner/m4_for_dummies.pdf
.
我想到了两种半可能的解决方案,但其中任何一种都需要帮助。
第一个是修改我的linux以使用文件系统的特殊属性。如果设置了该属性,那么我会寻找一个环境,例如
SPECIAL_OBJECT_IS_FILE
。如果已设置,我会将其视为文件。如果未设置,我会将其视为目录。这种方法的问题在于,我不知道如何在不修改整个系统的情况下实现它。第二种技术是将文件存储在存档(例如 tar、zip、rar)中,我将其挂载(rw)到某个目录。要将对象视为存档,请参阅原始存档;要将对象视为目录,请参阅挂载点。这可能吗?
一半技术只是第二种技术的简单变形,我没有安装档案,而是创建了一些指向它的链接。这样的事情可能吗?
我不敢相信没有人想做类似的事情,所以我怀疑有某种方法。建议?
答案1
我不太明白为什么您不希望这些文件在某些情况下显示为单独的文件。毕竟,如果my_books_on_m4_programming.arch
是一个目录,您仍然可以使用 复制它cp -rp
,使用 定位它locate
等等。
保险丝(用户空间中的文件系统)提供了一种实现轻量级文件系统的方法,并且有许多 FUSE 文件系统提供现有文件的替代视图。使相同的文件(如相同的文件路径)同时显示为目录和常规文件会使许多应用程序感到困惑,但是有许多现有的解决方案可以使相同的文件在一个位置显示为目录,在一个位置显示为文件另一个地点。
尤其,AVFS使档案和远程文件显示为目录。我认为这是最接近您正在寻找的现有事物。
$ mountavfs
$ ls my_books_on_m4_programming*
my_books_on_m4_programming.tgz
$ tar tzf my_books_on_m4_programming.tgz
beginner/m4_for_dummies.pdf
$ ls ~/.avfs$PWD/my_books_on_m4_programming.tgz\#/
beginner
$ okular ~/.avfs$PWD/my_books_on_m4_programming.tgz\#/beginner/m4_for_dummies.pdf
答案2
您可以考虑使用环回文件系统。
首先,创建一个文件来包含您的文件系统:
dd if=/dev/zero of=~/myfilesys bs=8K count=256
这将创建一个空的 2GB 文件。接下来,您需要将其连接到环回设备:
losetup /dev/loop0 ~/myfilesys
现在,创建一个文件系统:
mkfs -t ext3 /dev/loop0
最后,挂载你的文件系统:
mkdir ~/myfilesys.d
mount /dev/loop0 ~/myfilesys.d
当你完成后:
umount /dev/loop0
losetup -d /dev/loop0
并稍后重新使用:
losetup /dev/loop0 ~/myfilesys
mount /dev/loop0 /mnt/myfilesys.d
(是的,我知道您可以将losetup
和mount
步骤结合起来,但出于说明目的,将它们分开可以更清楚地看到发生了什么)。
现在,该~/myfilesys
文件的外观和行为就像所有命令的文件一样,但是安装后,您可以在~/myfilesys.d
.