我是 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
使用
pushd
和popd
。 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 需要时间和大量的系统调用。