#linux #bash #filesystems #command-line-interface
Вопрос:
Я потратил некоторое время на поиск решения своей проблемы, но Google не смог дать мне достаточного ответа… Я много работаю с командной строкой в Linux, и мне просто нужен способ быстрой навигации по моей файловой системе. Я не хочу все время вводить cd [относительный или отсутствующий путь]. Я знаю, что есть pushd и popd, но это все еще кажется слишком сложным для такой простой проблемы, как эта.
Когда я нахожусь внутри ~/Desktop/sampleFile
, я просто хочу использовать sampleCommand fileToGo
, чтобы добраться ~/Desktop/anotherFile/anotherFile/fileToGo
, независимо от того, где находится файл. Есть ли для этого простая команда?
Заранее спасибо!
Комментарии:
1. Может
cdable_vars
быть, и, в частности,CDPATH
может помочь упростить для вас некоторые вещи. Посмотрите их описание на главной странице BASH. Однако найти запись каталога независимо от того, где она находится в вашей файловой системе, практически невозможно разумным способом. Вам придется обновлять индекс всех записей каталогов во всех смонтированных файловых системах, и на практике многие имена каталогов будут дублироваться (почти у каждого пользователя, скорее всего, будет свой собственный каталог bin или tmp ), и большинство имен будут неоднозначными.
Ответ №1:
Это можно сделать с помощью встроенных функций Bash без использования вилки под оболочкой:
Вы можете вставить это в свой "$HOME/.bashrc"
:
cdf(){
# Query globstar state
shopt -q globstar
# and save it in the gs variable (gs=0 if set, 1 if not)
local gs=$?
# Need globstar to glob find files in sub-directories
shopt -s globstar
# Find the file in directories
# and store the result into the matches array
matches=(**/"$1")
# globstar no longer needed, so restore its previous state
[ $gs -gt 0 ] amp;amp; shopt -u globstar
# Change to the directory containing the first matched file
cd "${matches[0]%/*}" # cd EXIT status is preserved
}
Комментарии:
1. Мило! Возможно, было бы неплохо сохранить начальную настройку globstar и вернуть ее в прежнее состояние, чтобы избежать неожиданностей позже.
2. @MarkSetchell осуществил
globstar
восстановление состояния
Ответ №2:
Хм, ты мог бы сделать что-то вроде этого:
cd $(dirname $(find . -name name-of-your-file | head -n 1))
Это приведет к поиску в текущем каталоге (используйте /
вместо .
поиска во всех каталогах) файла с именем name-of-your-file
и cd
в родительском каталоге первого файла с этим именем, который он найдет.
Если вы находитесь в большом каталоге, ввод пути и использование cd
, вероятно, будут быстрее, чем это, но для небольших каталогов это работает нормально.
Комментарии:
1. Вы могли бы превратить это в
bash
функцию, вызываемуюcdf
дляcd **fast**
см. linuxize.com/post/bash-functions2. Для аргументов команд нужны двойные кавычки