Я новичок в Linux, и мне было интересно, может ли относительный путь получить доступ более чем к одному уровню.
Например:
/home/john/Desktop/Myfiles/text.txt
Если я в настоящее время на ~/
, могу ли я перейти к text.txt
без необходимости писать Desktop/Myfiles/
на моем пути?
Да, все пути могут иметь несколько компонентов. «Относительные» пути не начинаются с «/
», а начинают поиск в текущем каталоге. «Абсолютные» пути начинаются с «/
» и начинаются с поиска корня дерева файловой системы, также называемого «/
».
Таким образом, вы можете использовать следующие пути:
cd $HOME
ls Desktop/MyFiles/text.txt
или:
cd $HOME/Desktop/MyFiles
ls text.txt
В любом случае ls /etc/passwd
будет ссылаться на один и тот же файл.
Пропуск частей пути не может быть сделан, который является Вами, не может сделать чего-то как cd ~/.../Myfiles
. Предположим, что Вы имеете /home/john/Desktop/Myfiles/
и /home/john/Documents/Myfiles
. Когда Вы хотите перейти к Myfiles
, какой Вы имеете в виду? Один в ~/Desktop
или ~/Documents
. Существенная причина состоит в том, потому что структура каталогов организована в дерево, где каждый предыдущий элемент должен иметь родительский элемент. Таким образом вопрос становится, кто родительский каталог Myfiles
когда существует два из них?
Однако существует несколько вещей, которые помогают навигации по долгим путям:
myfiles=/home/john/Desktop/Myfiles
. При запуске оболочки Вы уже имеете $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
и проверка всего inodes по пути требует времени и большого количества syscalls.