Как быстро перемещаться по каталогам с помощью командной строки?

#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-functions

2. Для аргументов команд нужны двойные кавычки