вторник, 1 сентября 2009 г.

Wcd и CDargs. Удобные бродилки по файловой системе.

Известно, что для навигации по директориям файловой системы в Linux используется команда cd:

$ cd Directory/

Если же директория запрятана далеко, то неизбежно придётся набирать команду:

$ cd /path/to/deeply/hidden/directory/subdirectory/destination

Чтобы добраться до destination даже с учётом дополнения по TAB, придётся потрудиться.

Как это сделать проще?

Здесь мы рассмотрим три способа ускорения навигации в консоли по файловой системе.

Алиасы

Во-первых, для часто посещаемых директорий можно создать алиасы. Например, пропишем в ~/.bashrc (если используем оболочку bash):

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

Теперь в файле ~/.bash_aliases будем записывать алиасы:

alias destination='cd /path/to/deeply/hidden/directory/subdirectory/destination'

После обновления оболочки (source ~/.bashrc или простого перезапуска терминала) для того, чтобы пройти по предыдущему пути, в командной строке будет достаточно набрать

$ destination
Более того, будет работать автодополнение (если оно установлено, конечно).

К преимуществам можно отнести простоту и удобство в виде автодополнения. Недостаток же состоит в том, что кроме как перейти в назначенную директорию, мы будем не в состоянии.

Например, пусть в директории destination есть поддиректория subdirectory. Перейти в неё за одно действие описанным способом нельзя. Команда destination/subdirectory не сработает, алиасы bash этого не понимают. Алиасы в zsh поумнее, возможно, они с этим справятся, но я не специалист в этом вопросе.

Программа WCD

WCD (Wherever Change Directory) позволяет быстро менять директории. Программа кэширует дерево каталогов, после чего для перехода в destination из любой точки файловой системы достаточно скомандовать.

$ wcd destination

Здесь не будет работать автодополнение (по крайней мере у меня не работает. Если кто завёл - отзовитесь :) Зато будут функционировать wildcards * и ?. Более того, можно использовать неполное имя директории. Например, сработают варианты:

$ wcd dest
$ wcd *tion
$ wcd dest??ation

Если под запрос попадает несколько вариантов, будет выведен список, в котором можно будет выбрать нужный вариант (если вариантов очень много, то выведется постраничный листинг, для навигации в котором используются клавиши w и x):

a /usr/share/doc/texlive-latex-extra-doc/latex/datenumber
b /usr/share/doc/texlive-latex-extra-doc/latex/datetime
c /usr/share/icons/gnome/16x16/stock/data
d /usr/share/icons/gnome/24x24/stock/data
e /usr/share/icons/gnome/48x48/stock/data
f /usr/share/icons/hicolor/128x128/stock/data
g /usr/share/icons/hicolor/16x16/stock/data
h /usr/share/icons/hicolor/192x192/stock/data
i /usr/share/icons/hicolor/22x22/stock/data
j /usr/share/icons/hicolor/24x24/stock/data
k /usr/share/icons/hicolor/32x32/stock/data
l /usr/share/icons/hicolor/36x36/stock/data
m /usr/share/icons/hicolor/48x48/stock/data
n /usr/share/icons/hicolor/64x64/stock/data
o /usr/share/icons/hicolor/72x72/stock/data
p /usr/share/icons/hicolor/96x96/stock/data
q /usr/share/icons/hicolor/scalable/stock/data
r /usr/share/texmf-texlive/tex/latex/dateiliste
s /usr/share/texmf-texlive/tex/latex/datenumber
t /usr/share/texmf-texlive/tex/latex/datetime
u /usr/share/texmf-texlive/tex/latex/ucs/data
v /var/spool/openoffice/uno_packages/cache/registry/com.sun.star.comp.deploym

Wild match for 137 directories.       w=up x=down ?=help  Page 7/7
Please choose one (<Enter> to abort):

С применением wcd есть возможность заходить в поддиректории назначения, но здесь уже не будет работать автодополнение. То есть либо придётся по памяти набивать поддиректорию, используя wildcard, либо, в случае малой вложенности директорий, в качестве поддиректории сразу вколотить *

$ wcd destination/*
Установка WCD

В Debian пакет есть в репозиториях, поэтому просто:

$ sudo aptitude install wcd

После этого копируем бинарник программы куда-нибудь в $PATH (проверить можно по echo $PATH). В моём случае это ~/bin.

$ cp /usr/lib/wcd/wcd.exec ~/bin

Дальше всё по мануалу (man wcd). Лезем в ~/.bashrc (или какая там у вас оболочка?) и добавляем:

# WCD function
function wcd
{
   $HOME/bin/wcd.exeс $*

   . $HOME/bin/wcd.go
}
(Для csh будет alias wcd "$HOME/bin/wcd.exe \!* ; source $HOME/bin/wcd.go")

После этого перезапускаем оболочку и... ещё не радуемся. Надо же просканировать необходимые директории. Вся домашняя директория (пере)сканируется с использованием ключа -s, какой-то заданный путь - с ключом -A (добавляется, а не перезаписывается):

$ wcd -s
$ wcd -A /media
Можно объединить
$ wcd -s -A /media/

Теперь можно пользоваться программой. У wcd много дополнительных возможностей, например графический интерфейс, который строит дерево каталогов:

$ wcd -ga
        |         |       |        |- 700
        |         |       |        |- mm4b -+- 550_105min
        |         |       |        |        |- 550_30min
        |         |       |        |        |- 625
        |         |       |        |        `- 725
        |         |       |        `- old_MM4_PeaksCorrection -+- 350
        |         |       |                                    |- 400
        |         |       |                                    |- 450
        |         |       |                                    |- 500
        |         |       |                                    |- 550
        |         |       |                                    |- 600
        |         |       |                                    |- 625
        |         |       |                                    |-<650>

        |         |       |                                    |- 675
        |         |       |                                    `- 700
        |         |       `- results
        |         |- old_perovskites -+- Membrane -+- air -+- dat
        |         |                   |            |       `- raw
        |         |                   |            |- graphs -+- Air
        |         |                   |            |          `- Vacuum
        |         |                   |            |- photo -+- 280307
        |         |                   |            |         `- 290307
        |         |                   |            |- synchrotron -+- correct
        |         |                   |            |               `- uxd
        |         |                   |            `- vacuum --- Vac_dat
Однако для меня достаточно лишь быстрого хождения по директориям.

Программа CDargs

Эта программа предоставляет меньшую функциональность, нежели wcd, однако может оказаться более удобной. По сути она позволяет формировать закладки в файловой системе для быстрого доступа к ним.

$ cv bookmark
/path/to/buried/directory/with/bookmark
То есть, скомандовав перейти в bookmark из любой директории, мы прошли разом весь путь.

Какое же отличие от простых алиасов? Во-первых, есть возможность заходить в поддиректории, более того, с использованием автодополнения.

$ cv Music [TAB]
Music/Audiobooks/   Music/Foreign/      Music/Sounds/
Music/Classic/      Music/Fun/          Music/Soundtrack/
Music/Collections/  Music/Russian/
$ cv Music/Classic/ [TAB]
Music/Classic/Classic\ in\ rock/     Music/Classic/\М\у\с\о\р\г\с\к\и\й/
Music/Classic/PlanetClassic/         Music/Classic/\П\у\ч\ч\и\н\и/
Music/Classic/\В\и\в\а\л\ь\д\и/      Music/Classic/\Р\а\х\м\а\н\и\н\о\в/
Music/Classic/\Д\в\о\р\ж\а\к/        Music/Classic/\Р\о\с\с\и\н\и/
Music/Classic/\М\о\ц\а\р\т/          Music/Classic/\Ч\а\й\к\о\в\с\к\и\й/

Во-вторых, есть возможность быстрого копирования файлов в точку ФС, куда указывает закладка.

$ cpb foo bookmark/subdirectory
Но тут, к сожалению, не работает дополнение по табу :(

В третьих есть псевдогуи, на ncurses.

Установка CDargs

В Debian Lenny, опять же, программа есть. Поэтому

$ sudo aptitude install cdargs

После этого можно запустить cdargs и почитать справку, нажав ?. Можно добавить закладки через GUI, а можно просто отредактировать файл ~/.cdargs:

cac /home/maxim/Documents/conferences/cac
Documents /home/maxim/Documents
Music /home/maxim/Music
Video /home/maxim/Video
devel /home/maxim/devel
python-dev /home/maxim/devel/python
Incomplete /home/maxim/p2p/Incomplete
p2p /home/maxim/p2p
data /media/data/

Для bash в ~/.bashrc пишем:

# CDargs function
if [ -e /usr/share/doc/cdargs/examples/cdargs-bash.sh ]; then

  . /usr/share/doc/cdargs/examples/cdargs-bash.sh
fi
function cv () {
    cdargs "$1" && cd "‘cat "$HOME/.cdargsresult"‘" ;
}

Теперь, после перезапуска оболочки бегаем по файловой системе со скоростью спринтера.

Резюме

Второй и третий методы более совершенны, нежели первый. У каждого есть свои плюсы и минусы, поэтому лично я использую оба, тем более, что с cdargs я познакомился совсем недавно.

Несомненно, программы wcd и cdargs существенно облегчат жизнь обитателям консоли. Напоследок хотелось бы отметить, что с cdargs я познакомился благодаря обзору на Debian Package of the Day.

Копируете статью - поставьте ссылку на оригинал!

Комментариев нет:

Отправить комментарий