相对路径可以访问多个级别吗?

相对路径可以访问多个级别吗?

我是 Linux 新手,想知道相对路径是否可以访问多个级别。

例如:

/home/john/Desktop/Myfiles/text.txt

如果我目前在,~/我可以跳转到text.txt而不必写下Desktop/Myfiles/我的路径吗?

答案1

是的,所有路径都可以有多个组成部分。“相对”路径不以“ /”开头,而是从当前目录中开始查找。“绝对”路径以“ /”开头,并从文件系统树的根目录(也称为“ ”)开始查找/

因此,您可以使用如下路径:

cd $HOME
ls Desktop/MyFiles/text.txt

或者:

cd $HOME/Desktop/MyFiles
ls text.txt

无论哪种情况,ls /etc/passwd都会引用同一个文件。

答案2

无法跳过路径的某些部分,也就是说,您无法执行类似 的操作 cd ~/.../Myfiles。假设您有/home/john/Desktop/Myfiles//home/john/Documents/Myfiles。当您想要导航到 时Myfiles,您指的是哪一个?~/Desktop或中的一个。根本原因是目录结构被组织成树状结构,其中每个前面的元素都必须有一个父项。因此,问题变成了当有两个 时~/Documents谁是 的父目录?Myfiles

然而,有几件事可以帮助导航长路径名:

  • 将绝对路径保存到变量中。例如myfiles=/home/john/Desktop/Myfiles。启动 shell 时,您已经有$HOME特殊变量,或者您可以使用波浪符号扩展cd ~/Desktop/Myfiles
  • 使用pushdpopd。 Shell 有一个称为“目录堆栈”的东西,可用于记录目录序列。例如,如果我这样做

    $ pushd /etc
    /etc ~
    
    $ pushd /sys/class/backlight/intel_backlight/
    /sys/class/backlight/intel_backlight /etc ~
    
    $ pushd .
    /sys/class/backlight/intel_backlight /sys/class/backlight/intel_backlight /etc ~
    

    请注意,dirstack 中的第一个项目表示当前工作目录,而第二个项目即使您身处cd其他地方也不会改变。这就是pushd .添加的原因。现在,如果我们导航到其他地方,/sys/class/backlight/intel_backlight它将存储在堆栈中,我们始终可以返回到它。

    # navigate elsewhere after pushd .
    $ cd /var/log
    $ cd /usr/share
    # check what's in the stack
    $ echo ${DIRSTACK[@]}
    /usr/share /sys/class/backlight/intel_backlight /etc /home/ubuntuadmin
    # go to one of the directories on the stack
    $ cd ${DIRSTACK[1]}
    $ pwd
    /sys/class/backlight/intel_backlight
    # remember that very first item changes, it's the current working directory
    $ echo ${DIRSTACK[@]}
    /sys/class/backlight/intel_backlight /sys/class/backlight/intel_backlight /etc /home/ubuntuadmin
    
  • 使用符号链接。示例:

    $ ln -s /var/log ~/logs
    $ cd ~/logs
    

    cd /var/log现在,您可以执行 ,而不是cd ~/logs。这是一个简单的例子,但想象一下,如果/var/log/media/external_harddrive/someproject/subproject/data/bignumbers/calculations/。如果我们有符号链接,我们就可以cd ~/calculations这样做。当然,符号链接的缺点是,当目录被重命名或删除时,符号链接仍然存在并被破坏,但这是一个简单的修复 - 重新创建符号链接的完整路径或删除符号链接并创建新的符号链接。我们还可以创建一个指向指向实际目录的符号链接的符号链接,但请注意,如果符号链接的级别超过 ,Linux 内核会限制太多级别(您会收到一个错误,说明这一点)40 个符号链接

    如果目标是创建一种快速打开文件的方法,text.txt符号链接方法可以帮助我们实现这一点

    $ echo 'Hello, this is a test' > ~/Documents/another_directory/file.txt
    $ ln -s ~/Documents/another_directory/file.txt ~/file.symlink
    $ cat ~/file.symlink 
    Hello, this is a test
    $ 
    
  • 您可以使用 inode 编号。这通常用于处理复杂的文件名,其中引用和特殊字符会成为问题。例如,如果我们知道目录的 inode

    # return $HOME
    $ cd
    # find the inode
    $ ls -id  ~/Documents/things
    1205421 /home/ubuntuadmin/Documents/things
    # go to the directory by inode
    $ cd "$(find -inum 1205421)"
    $ pwd
    /home/ubuntuadmin/Documents/things
    

    这种方法的问题在于它很慢而且效率低,因为递归遍历find和检查沿途的所有 inode 需要时间和大量的系统调用。

相关内容