对于文件,列出所有挂载到根目录的文件

对于文件,列出所有挂载到根目录的文件

我有一个想要在容器内访问的文件。完整路径从一个磁盘跳转到另一个磁盘。这意味着通过反复试验,我不断添加更多绑定点,直到它起作用为止。我想要一个更好的方法。

有没有一种自动方式来查找该列表。从视觉上看,我可以看到我已经转到了不同的驱动器,但是有属性可以告诉我吗?我想跳转至少必须是一个符号链接。

举个例子,如果我有挂载点、、/和一个我想要列出的文件(我不关心任何一种方式)。/var/usr/var/log/thing.log/var/

感谢您的任何指导。

答案1

您可以按照文件的路径名进行操作,报告当前路径的安装点

item=/var/log/thing.log
while [ -n "$item" ]      # Stop when we reach the top
do
    stat -c %m "$item"    # Report the mountpoint
    item="${item%/*}"     # Strip back one component of the path
done |
    uniq                  # Discard duplicates

如果您愿意,可以将所有内容压缩为一行:

while [ -n "$item" ]; do stat -c %m "$item"; item="${item%/*}"; done | uniq

答案2

当前进程的所有安装信息都位于/proc/self/mountinfo。最好仔细看看:

# show_mounts [file_or_dir] [show_hidden]
show_mounts(){
  tac /proc/self/mountinfo |
  awk -v p=$(realpath "${1:-.}") -v h="$2" '
    mi ? mi==$1 : index(p,$5)==1 {mi=$2; if(h || !a[$5]++) printf "%-20s %s\n", $5, $9 }
  '
}

例子:

$ unshare -Urm
# mkdir -p ~/junk/dir{1,2}
# cd ~/junk
# for i in 1 2 3 4; do mount -B dir1 dir2; done
# show_mounts dir2
/home2/ahq/junk/dir2 /dev/sdb9
/home2               /dev/sdb9
/                    /dev/sdb8

# show_mounts dir2 show_hidden
/home2/ahq/junk/dir2 /dev/sdb9
/home2/ahq/junk/dir2 /dev/sdb9
/home2/ahq/junk/dir2 /dev/sdb9
/home2/ahq/junk/dir2 /dev/sdb9
/home2               /dev/sdb9
/                    /dev/sdb8

当然,这假设/proc/self/mountinfo它的主目录之一本身尚未安装;-)

相关内容