Превод от
http://www.pro-linux.de/news/2009/14160.html:
Удобна смяна на директории fcd (find change directory). Няма нужда да се въвежда целия път до директорията:
Примери:
1. Директория с уникално име във файловата система
GeSHi (Bash):
user@rechner:~> fcd rc3.d
user@rechner:/etc/rc3.d>
2. Директория с неуникално име
GeSHi (Bash):
user@rechner:/etc/rc3.d> fcd linux
1) /user/alsa/alsa-driver-1.0.17/include/linux
2) /usr/include/linux
3) /usr/lib/gcc/i486-linux-gnu/4.1/include/linux
4) /usr/lib/gcc/i486-linux-gnu/4.3/include-fixed/linux
5) /usr/lib/perl/5.10.0/linux
6) /usr/share/zsh/functions/Completion/Linux
7) /usr/src/linux-2.6.14.4/include/linux
8) /usr/src/linux-headers-2.6.26-2-686/include/linux
9) /usr/src/linux-headers-2.6.26-2-common/include/linux
10) /usr/src/modules/alsa-driver/include/linux
#? 2
user@rechner:/usr/include/linux>
3. Може да се въведе и субстринг от уникално име на директория:
GeSHi (Bash):
user@rechner:/usr/include/linux> fcd voice
user@rechner:/var/spool/asterisk/voicemail>
4. Или сусбтринг на директория с неуникално име:
GeSHi (Bash):
user@rechner:/var/spool/asterisk/voicemail> fcd altern
1) /etc/alternatives
2) /var/lib/dpkg/alternatives
#? 1
user@rechner:/etc/alternatives>
А ето и как може да се реализира:
Търсенето се осъществява в предварително създаден файл-списък на всички директории на файловата система (маунтнати естествено). За тази цел ни трябва следния скрипт:
GeSHi (Bash):
#!/bin/bash
find / -type d 2> /dev/null | sort > /var/tmp/dirs
Може да го запазите на пример като /usr/local/bin/dirlocate и да го вкарате в cron.daily или cron.weekly или crontab и т.н. От това зависи актуализирането на списъка на директориите.
Естествено всеки може да си промени търсенето както си иска. На пример да изключим директориите от бекап-а :
GeSHi (Bash):
find / -type d -path /mnt/backup -prune -o -print 2> /dev/null | sort > /var/tmp/dirs
Ето и самата bash-функция, която се копира в .bashrc или друг скрипт, който се изпълнява при логин.
GeSHi (Bash):
function fcd () {
dirdat="/var/tmp/dirs"
suche=$1
if [ -n "$suche" ]; then
# Internal Field Separator wg. moegl. Leerzeichen in Verz.namen umbiegen
IFSOLD=$IFS
IFS=$(echo -en "\n\t");
# erste Suche nach exakten Treffern
dirs=$(grep -i -E \/$suche$ $dirdat)
set -f; set -- $dirs; set +f; anz=$#
# grosszuegiger suchen, wenn kein Ergebnis
if [ $anz -eq 0 ]; then
dirs=$(grep -i -E \/.*$suche[^/]*$ $dirdat)
set -f; set -- $dirs; set +f; anz=$#
fi
case $anz in
0)
;;
1)
cd $dirs
;;
*)
select v in $dirs; do
cd $v;
break;
done
;;
esac
IFS=$IFSOLD
fi
}
[/code]