Закладка каталогов для bash
Есть ли какая-либо утилита закладок в каталоге для bash, чтобы позволить быстрее перемещаться в командной строке?
UPDATE
Спасибо, ребята за отзывы, однако я создал свою собственную простую оболочку script (не стесняйтесь ее изменять/расширять)
function cdb() {
USAGE="Usage: cdb [-c|-g|-d|-l] [bookmark]" ;
if [ ! -e ~/.cd_bookmarks ] ; then
mkdir ~/.cd_bookmarks
fi
case $1 in
# create bookmark
-c) shift
if [ ! -f ~/.cd_bookmarks/$1 ] ; then
echo "cd `pwd`" > ~/.cd_bookmarks/"$1" ;
else
echo "Try again! Looks like there is already a bookmark '$1'"
fi
;;
# goto bookmark
-g) shift
if [ -f ~/.cd_bookmarks/$1 ] ; then
source ~/.cd_bookmarks/"$1"
else
echo "Mmm...looks like your bookmark has spontaneously combusted. What I mean to say is that your bookmark does not exist." ;
fi
;;
# delete bookmark
-d) shift
if [ -f ~/.cd_bookmarks/$1 ] ; then
rm ~/.cd_bookmarks/"$1" ;
else
echo "Oops, forgot to specify the bookmark" ;
fi
;;
# list bookmarks
-l) shift
ls -l ~/.cd_bookmarks/ ;
;;
*) echo "$USAGE" ;
;;
esac
}
УСТАНОВИТЬ
1./создайте файл ~/.cdb и скопируйте в него script.
2./в вашем ~/.bashrc добавьте следующие
if [ -f ~/.cdb ]; then
source ~/.cdb
fi
3./перезапустите сеанс bash
ИСПОЛЬЗОВАНИЕ
1./для создания закладки
$cd my_project
$cdb -c project1
2./перейти к закладке
$cdb -g project1
3./для отображения закладок
$cdb -l
4./удалить закладку
$cdb -d project1
5./где хранятся все мои закладки?
$cd ~/.cd_bookmarks
Ответы
Ответ 1
Кроме того, посмотрите CDPATH
Список путей поиска, разделенных двоеточиями, доступный для команды cd, аналогичный функции переменной $PATH для двоичных файлов. Переменная $CDPATH может быть установлена в локальном файле ~/.bashrc.
ash$ cd bash-doc
bash: cd: bash-doc: No such file or directory
bash$ CDPATH=/usr/share/doc
bash$ cd bash-doc
/usr/share/doc/bash-doc
bash$ echo $PWD
/usr/share/doc/bash-doc
и
cd -
Это эквивалент командной строки кнопки "Назад" (переносит вас в предыдущий каталог, в котором вы были).
Ответ 2
Спасибо, что поделились вашим решением, и я тоже хотел бы поделиться своим делом, который я считаю более полезным, чем что-либо еще, с чем я сталкивался раньше.
Двигатель - отличный универсальный инструмент: нечеткий поисковик командной строки от Junegunn.
Он в первую очередь позволяет вам "нечетко находить" файлы несколькими способами, но также позволяет передавать на него произвольные текстовые данные и фильтровать эти данные. Итак, идея ярлыков проста: все, что нам нужно, это поддерживать файл с путями (которые являются ярлыками) и нечетко фильтровать этот файл. Вот как это выглядит: мы набираем команду cdg
(из "cd global", если хотите), получите список наших закладок, выберите нужный файл всего за несколько нажатий клавиш и нажмите "Enter". Рабочий каталог изменяется на выбранный элемент:
![cdg]()
Это очень быстро и удобно: обычно я просто набираю 3-4 буквы нужного элемента, а все остальные уже отфильтровываются. Кроме того, конечно, мы можем перемещаться по списку с помощью клавиш со стрелками или с помощью vim-подобных клавиш Ctrl+j
/Ctrl+k
.
Статья с подробностями: Нечеткие ярлыки для вашей оболочки.
Можно также использовать его для приложений GUI (через xterm): я использую это для своего диспетчера файлов GUI Double Commander. Я также планирую написать статью об этом случае использования.
Ответ 3
В bash script/command,
вы можете использовать pushd
и popd
pushd
Сохранить, а затем изменить текущий каталог. Без аргументов pushd обменивается двумя верхними каталогами.
Использование
cd /abc
pushd /xxx <-- save /abc to environment variables and cd to /xxx
pushd /zzz
pushd +1 <-- cd /xxx
popd - удалить переменную (обратную сторону)
Ответ 4
bookmarks.sh предоставляет систему управления закладок для Bash версии 4.0+. Он также может использовать горячий список Midnight Commander.
Ответ 5
Bashmarks - это удивительно простая и интуитивно понятная утилита.
Короче говоря, после установки, использование:
s <bookmark_name> - Saves the current directory as "bookmark_name"
g <bookmark_name> - Goes (cd) to the directory associated with "bookmark_name"
p <bookmark_name> - Prints the directory associated with "bookmark_name"
d <bookmark_name> - Deletes the bookmark
l - Lists all available bookmarks
Ответ 6
Вдохновленный вопросом и ответами здесь, я добавил строки ниже в мой ~/.bashrc
файл.
С помощью этой команды (функции) favdir
вы можете управлять своими избранными и функцией автозаполнения, чтобы выбрать элемент из этих избранных.
# ---------
# Favorites
# ---------
__favdirs_storage=~/.favdirs
__favdirs=( "$HOME" )
containsElement () {
local e
for e in "${@:2}"; do [[ "$e" == "$1" ]] && return 0; done
return 1
}
function favdirs() {
local cur
local IFS
local GLOBIGNORE
case $1 in
list)
echo "favorite folders ..."
printf -- ' - %s\n' "${__favdirs[@]}"
;;
load)
if [[ ! -e $__favdirs_storage ]] ; then
favdirs save
fi
# mapfile requires bash 4 / my OS-X bash vers. is 3.2.53 (from 2007 !!?!).
# mapfile -t __favdirs < $__favdirs_storage
IFS=$'\r\n' GLOBIGNORE='*' __favdirs=($(< $__favdirs_storage))
;;
save)
printf -- '%s\n' "${__favdirs[@]}" > $__favdirs_storage
;;
add)
cur=${2-$(pwd)}
favdirs load
if containsElement "$cur" "${__favdirs[@]}" ; then
echo "'$cur' allready exists in favorites"
else
__favdirs+=( "$cur" )
favdirs save
echo "'$cur' added to favorites"
fi
;;
del)
cur=${2-$(pwd)}
favdirs load
local i=0
for fav in ${__favdirs[@]}; do
if [ "$fav" = "$cur" ]; then
echo "delete '$cur' from favorites"
unset __favdirs[$i]
favdirs save
break
fi
let i++
done
;;
*)
echo "Manage favorite folders."
echo ""
echo "usage: favdirs [ list | load | save | add | del ]"
echo ""
echo " list : list favorite folders"
echo " load : load favorite folders from $__favdirs_storage"
echo " save : save favorite directories to $__favdirs_storage"
echo " add : add directory to favorites [default pwd $(pwd)]."
echo " del : delete directory from favorites [default pwd $(pwd)]."
esac
} && favdirs load
function __favdirs_compl_command() {
COMPREPLY=( $( compgen -W "list load save add del" -- ${COMP_WORDS[COMP_CWORD]}))
} && complete -o default -F __favdirs_compl_command favdirs
function __favdirs_compl() {
local IFS=$'\n'
COMPREPLY=( $( compgen -W "${__favdirs[*]}" -- ${COMP_WORDS[COMP_CWORD]}))
}
alias _cd='cd'
complete -F __favdirs_compl _cd
В двух последних строках создается псевдоним для изменения текущего каталога (с автозаполнением). С помощью этого псевдонима (_cd
) вы можете перейти в один из ваших любимых каталогов. Можете ли вы изменить этот псевдоним на то, что соответствует вашим потребностям.
С помощью функции favdirs
вы можете управлять своими избранными (см. использование).
$ favdirs
Manage favorite folders.
usage: favdirs [ list | load | save | add | del ]
list : list favorite folders
load : load favorite folders from ~/.favdirs
save : save favorite directories to ~/.favdirs
add : add directory to favorites [default pwd /tmp ].
del : delete directory from favorites [default pwd /tmp ].
Ответ 7
Да, есть DirB: Закладки каталога для Bash, хорошо объясненные в этой статье в Linux Journal
Пример из статьи:
% cd ~/Desktop
% s d # save(bookmark) ~/Desktop as d
% cd /tmp # go somewhere
% pwd
/tmp
% g d # go to the desktop
% pwd
/home/Desktop
Ответ 8
@getmizanur
Я использовал ваш cdb script. Я немного улучшил его, добавив вкладку закладка. Здесь моя версия вашего cdb script.
_cdb()
{
local _script_commands=$(ls -1 ~/.cd_bookmarks/)
local cur=${COMP_WORDS[COMP_CWORD]}
COMPREPLY=( $(compgen -W "${_script_commands}" -- $cur) )
}
complete -F _cdb cdb
function cdb() {
local USAGE="Usage: cdb [-h|-c|-d|-g|-l|-s] [bookmark]\n
\t[-h or no args] - prints usage help\n
\t[-c bookmark] - create bookmark\n
\t[-d bookmark] - delete bookmark\n
\t[-g bookmark] - goto bookmark\n
\t[-l] - list bookmarks\n
\t[-s bookmark] - show bookmark location\n
\t[bookmark] - same as [-g bookmark]\n
Press tab for bookmark completion.\n"
if [ ! -e ~/.cd_bookmarks ] ; then
mkdir ~/.cd_bookmarks
fi
case $1 in
# create bookmark
-c) shift
if [ ! -f ~/.cd_bookmarks/$1 ] ; then
echo "cd `pwd`" > ~/.cd_bookmarks/"$1"
complete -F _cdb cdb
else
echo "Try again! Looks like there is already a bookmark '$1'"
fi
;;
# goto bookmark
-g) shift
if [ -f ~/.cd_bookmarks/$1 ] ; then
source ~/.cd_bookmarks/"$1"
else
echo "Mmm...looks like your bookmark has spontaneously combusted. What I mean to say is that your bookmark does not exist." ;
fi
;;
# show bookmark
-s) shift
if [ -f ~/.cd_bookmarks/$1 ] ; then
cat ~/.cd_bookmarks/"$1"
else
echo "Mmm...looks like your bookmark has spontaneously combusted. What I mean to say is that your bookmark does not exist." ;
fi
;;
# delete bookmark
-d) shift
if [ -f ~/.cd_bookmarks/$1 ] ; then
rm ~/.cd_bookmarks/"$1" ;
else
echo "Oops, forgot to specify the bookmark" ;
fi
;;
# list bookmarks
-l) shift
ls -1 ~/.cd_bookmarks/ ;
;;
-h) echo -e $USAGE ;
;;
# goto bookmark by default
*)
if [ -z "$1" ] ; then
echo -e $USAGE
elif [ -f ~/.cd_bookmarks/$1 ] ; then
source ~/.cd_bookmarks/"$1"
else
echo "Mmm...looks like your bookmark has spontaneously combusted. What I mean to say is that your bookmark does not exist." ;
fi
;;
esac
}
Ответ 9
Да, тот, который я написал, который называется anc.
https://github.com/tobimensch/anc
Anc обозначает якорь, но анкеры якоря - это действительно закладки.
Он предназначен для простоты использования, и есть несколько способов навигации, либо путем предоставления текстового шаблона, использования чисел, в интерактивном режиме, путем возврата, либо с помощью завершения [TAB].
Я активно работаю над этим и открываю для ввода информации о том, как сделать его лучше.
Позвольте мне вставить примеры из страницы anc github здесь:
# make the current directory the default anchor:
$ anc s
# go to /etc, then /, then /usr/local and then back to the default anchor:
$ cd /etc; cd ..; cd usr/local; anc
# go back to /usr/local :
$ anc b
# add another anchor:
$ anc a $HOME/test
# view the list of anchors (the default one has the asterisk):
$ anc l
(0) /path/to/first/anchor *
(1) /home/usr/test
# jump to the anchor we just added:
# by using its anchor number
$ anc 1
# or by jumping to the last anchor in the list
$ anc -1
# add multiple anchors:
$ anc a $HOME/projects/first $HOME/projects/second $HOME/documents/first
# use text matching to jump to $HOME/projects/first
$ anc pro fir
# use text matching to jump to $HOME/documents/first
$ anc doc fir
# add anchor and jump to it using an absolute path
$ anc /etc
# is the same as
$ anc a /etc; anc -1
# add anchor and jump to it using a relative path
$ anc ./X11 #note that "./" is required for relative paths
# is the same as
$ anc a X11; anc -1
# using wildcards you can add many anchors at once
$ anc a $HOME/projects/*
# use shell completion to see a list of matching anchors
# and select the one you want to jump to directly
$ anc pro[TAB]
Ответ 10
В дополнение к @Dmitri Frank answer - я выполнил команду cdb
(aka cd bookmark) с помощью простого alias
(добавьте эту строку в свой ~/.bash_profile
):
alias b='cat ~/.cd-bookmarks | grep -v "^\s*#" | grep -v "^\s*$" | fzf'
alias cdb='cd "$(b)"'
Создайте файл ~/.cd-bookmarks
и введите свои пути, по одному на строку. Он поддерживает пустые строки и комментарии через #
:
$ cat ~/.cd-bookmarks
### Devel stuff ###
/Users/pujezdsky/devel/projects/stackoverflow/
### Photo stuff ###
/Users/pujezdsky/Photos/
/Users/pujezdsky/Photos/last-import/
/Users/pujezdsky/Photos/dir with spaces/
К сожалению, он не поддерживает расширение ~
, поэтому введите полные пути.
Затем вы можете сделать
$ cdb
И из-за b
псевдонима даже некоторые более продвинутые вещи
$ mc `b`
$ cp my-file.txt `b`
$ touch `b`/test.sh
К сожалению, однако, если у вас есть пробелы в пути к закладкам, вы должны процитировать вызов `b`
. Это делает его менее привлекательным:
$mc "`b`"
Примечание 1:
Прежде чем вы это сделаете, проверьте, есть ли у вас cdb
, b
команды/псевдонимы, чтобы избежать их перезаписывания и сбоя. Самый простой способ - использовать эти команды, которые должны возвращать что-то вроде -bash: type: cdb: not found
$ type cdb
$ type b
Примечание 2:
Алиас b
можно упростить до
alias b='egrep -v "(^\s*#|^\s*$)" ~/.cd-bookmarks | fzf'
Примечание 3:
Вы также можете сделать псевдоним для добавления текущей папки в закладки. Это так же просто, как
alias ba='pwd >> ~/.cd-bookmarks'
Ответ 11
Для краткосрочных ярлыков у меня есть следующее в моем соответствующем init script (Извините, я не могу найти источник прямо сейчас и не беспокоился тогда):
function b() {
alias $1="cd `pwd -P`"
}
Применение:
В любом каталоге, который вы хотите создать тип закладки
b THEDIR # <THEDIR> being the name of your 'bookmark'
Здесь будет создан псевдоним cd (назад).
Чтобы вернуться к типу с именем "bookmarked"
THEDIR
Он запустит сохраненный псевдоним и cd.
Предостережение: Используйте только в том случае, если вы понимаете, что это может переопределить существующие псевдонимы оболочки и что это значит.
Ответ 12
Я ежедневно использую to.sh для создания и навигации по закладкам в bash. Он поддерживает автозаполнение тегов и возможность легко добавлять/удалять закладки.
https://github.com/Grafluxe/to.sh
Полное раскрытие, я написал этот инструмент :)