我有一个管理长路径的问题.我怎样才能快速到达像这样的道路
/Users/User/.../.../.../.../.../Dev/C/card.c
我尝试了一个别名
alias cd C='cd /Users/User/.../.../.../.../.../Dev/C'
但我无法为两个单独的单词做别名.我在CDPATH中列出了很长的Bash别名和路径列表,所以我在犹豫是否要更多.如何管理长途径?
[回复的想法]
用户litb的回复揭示了我在管理中遇到的一些问题.诸如"CTRL + R","! - 3:1:2:4:x"和"增量搜索"之类的东西对我来说很难.它们可能有助于导航长目录,从某种意义上说,管理.
使用符号链接可能是最好的主意; 但是你可以比将它们全部转储到你的主目录更容易.
正如你所提到的,BASH有一个名为CDPATH的功能,在这里非常方便.
只需在homedir中创建一个隐藏文件夹(这样就不会使你的homedir太乱了):
$ mkdir ~/.paths $ cd ~/.paths $ ln -s /my/very/long/path/name/to/my/project project $ ln -s /some/other/very/long/path/to/my/backups backups $ echo 'CDPATH=~/.paths' >> ~/.bashrc $ source ~/.bashrc
这将在homedir中创建一个名为".paths"的目录,其中包含您经常使用的所有长目录位置的符号链接,然后将CDPATH bash变量设置为该目录(在.bashrc中)并重新读取.bashrc文件.
现在,您可以从任何地方前往任何这些路径:
$ cd project $ cd backups
给你一个简短的CDPATH,没有混乱的别名,更重要的是:一个非常简单的方法从其他应用程序(如UI应用程序)导航到那些长路径,只需进入〜/ .paths或将该目录添加到UI应用程序中侧边栏左右.
可能是您可以拥有的最简单的全方位解决方案.
考虑使用符号链接.我有一个~/work/
目录,我将符号链接放在我当前的所有项目中.
您也可以使用shell变量:
c='/Users/User/.../.../.../.../.../Dev/C'
然后:
cd "$c"
在主目录(或您选择的其他位置)中创建符号链接
ln -s
longDirectoryPath~/MySymLinkName
有关man ln
详细信息,请参阅
可能最简单的解决方案是使用:
alias cdc='cd /Users/User/.../.../.../.../.../Dev/C' alias cdbin='cd /Users/User/.../.../.../.../.../Dev/bin' alias cdtst='cd /Users/User/.../.../.../.../.../Dev/tst'
如果你一次只是在一个项目上工作.如果您处理多个项目,则可以使用另一个别名来更改上述别名中的目录.
所以,你会使用类似的东西:
proj game17 cdc make proj roman_numerals cdbin rm -f * proj game17 ; cdc
由于这是一个有用的东西,我决定整理一系列可以使用的脚本.它们都基于您放置在主目录中的配置文件以及源脚本的别名.该文件"~/.cdx_data"
的格式如下:
scrabble:top=~/dev/scrabble scrabble:src=~/dev/scrabble/src scrabble:bin=~/dev/scrabble/bin sudoku:top=~/dev/scrabble sudoku:src=~/dev/scrabble/src sudoku:bin=~/dev/scrabble/bin sudoku:data=~/dev/scrabble/data
并列出所有相关项目(本例中为scrabble和sodoku)及其目录(每个项目可能不同,但在此示例中有top,bin,src和data).
第一个动作是初始化东西,所以放:
. ~/.cdx_init
在.bash_profile的末尾,创建"~/.cdx_init"
文件为:
alias cdxl='. ~/.cdx_list' alias projl='. ~/.cdx_projlist' alias cdx='. ~/.cdx_goto' alias proj='. ~/.cdx_proj'
这将设置四个别名以获取我将在下面包含的文件.用法是:
cdxl - List all directories in current project. projl - List all projects. proj - Show current project. proj- Set current project to
(if allowed). cdx - Show current project/directory and expected/actual real directory, since they can get out of sync if you mix cd and cdx. cdx . - Set actual real directory to expected directory (in other words, get them back into sync). cdx
- Set directory to (if allowed).
实际的脚本如下.首先,".cdx_list"
它只列出当前项目中允许的目录(为了便于阅读,管道分为多行,但它们都应该在一行上).
echo "Possible directories are:" cat ~/.cdx_data | grep "^${CDX_PROJ}:" | sed -e 's/^.*://' -e 's/=.*$//' | sort -u | sed 's/^/ /'
同样,".cdx_projlist"
显示所有可能的项目:
echo "Possible projects are:" cat ~/.cdx_data | grep ':' | sed 's/:.*$//' | sort -u | sed 's/^/ /'
在多肉的脚本中,".cdx_proj"
设置和/或显示当前项目:
if [[ "$1" != "" ]] ; then grep "^$1:" ~/.cdx_data >/dev/null 2>&1 if [[ $? != 0 ]] ; then echo "No project name '$1'." projl else export CDX_PROJ="$1" fi fi echo "Current project is: [${CDX_PROJ}]"
并且".cdx_goto"
对于项目中的目录是相同的:
if [[ "$1" == "." ]] ; then CDX_TMP="${CDX_DIR}" else CDX_TMP="$1" fi if [[ "${CDX_TMP}" != "" ]] ; then grep "^${CDX_PROJ}:${CDX_TMP}=" ~/.cdx_data >/dev/null 2>&1 if [[ $? != 0 ]] ; then echo "No directory name '${CDX_TMP}' for project '${CDX_PROJ}'." cdxl else export CDX_DIR="${CDX_TMP}" cd $(grep "^${CDX_PROJ}:${CDX_DIR}=" ~/.cdx_data | sed 's/^.*=//' | head -1 | sed "s:^~:$HOME:") fi fi CDX_TMP=$(grep "^${CDX_PROJ}:${CDX_DIR}=" ~/.cdx_data | sed 's/^.*=//' | head -1 | sed "s:^~:$HOME:") echo "Current project is: [${CDX_PROJ}]" echo "Current directory is: [${CDX_DIR}]" echo " [${CDX_TMP}]" echo "Actual directory is: [${PWD}]" unset CDX_TMP
它采用留作自己使用三个环境变量:"CDX_PROJ"
,"CDX_DIR"
和"CDX_TMP"
.除了那些以及上述文件和别名之外,没有使用其他资源.这是我能想到的最简单但最具适应性的解决方案.祝你好运.