Bash别名或函数找到Compass,并将CD放入目录

时间:2013-03-07 18:52:11

标签: bash terminal alias compass-sass sass

通常,我的项目在文件系统的深处都有一个SCSS + Compass目录。

例如,我的所有项目都位于~/Web/com.example.subdomain下,有时样式目录为~/Web/com.example.subdomain/trunk/docroot/_assets/locked/styles

每天多次输出整个CD命令显然有点重复。我可以为每个项目创建一个别名(例如alias cd-com.marketo.subdomain-scss="..."),但必须为所有25个以上的项目添加和维护。

那么我怎么能写一个有效地允许我输入的函数:

$ cd ~/Web/com.example
$ cd-compass

从这里开始,我想cd-compass会:

  1. 使用某种形式的find .命令查找config.rb.sass-cache/
  2. 如果两者都存在于同一目录中,那么您就知道它是指南针目录......
  3. 如果.sass-cache/不存在且config.rb有,则会compass stats /the/dir运行
    1. 如果它不是指南针目录,则输出将以Nothing to compile. If you're trying to start ...
    2. 开头
    3. 如果是指南针目录,它会吐出统计数据并创建.sass-cache/目录
  4. 成功找到目录后,它会将CD放入目录。
  5. 奖励积分:

      

    添加包含指南针命令的功能,因此输入cd-compass compile --force将遵循上面的流程(包括cd进入目录),然后执行compass compile --force

         

    在这种情况下,命令可能是compass-dofcompasslcompass(f = find; l = locate)。

    超级奖励积分:

      

    如果找到多个Compass安装,请显示编号的选项列表。输入其中一个数字并按Enter键将继续该选项。

         

    这基本上允许我输入:

         

    $ cd-compass

         

    1. /home/user/Web/git/com.example/trunk/docroot/admin/styles/compass

         

    2. /home/user/Web/git/com.example/trunk/docroot/styles/compass

         

    3. /home/user/Web/svn/com.example.sub/trunk/docroot/_assets/locked/styles

         

    Which one? > __

2 个答案:

答案 0 :(得分:1)

这并不能完成您想要的所有事情 - 例如,它不会构建.sass-cache如果它缺失但是它应该直接扩展它这样做(读者的练习:-)。如果目录名中有空格,它也将无效。

对于shell别名来说,这确实有点大。

首先,您需要将所有潜在目录放入变量

dirs=$(find . -name config.rb -o \( -type d -name .sass-cache \) | sed -e 's,/.sass-cache$,,' -e 's,/config\.rb$,,' | sort | uniq -c | grep '^ *2 ' | sed -e 's/^ *2 //')

这个位调用find来查找名为config.rb的任何文件或名为.sass-cache的目录。然后用sed剥去路径的最后一部分以获取目录名,对结果进行排序并计算简单结果路径的数量。然后只提取出现两次的目录,并从目录的开头删除计数......并且“嘿presto!”我们有一个Compass目录列表

然后计算它们中有多少:

count=0 ; for i in $dirs ; do : ; count=$((count+1)) ; done

或者你可以通过回显dirs变量并将其输送到“wc -w”来获得计数

然后你去处理不同的可能的计数值

if [ $count -eq 0 ] ; then echo no compass directory found; exit ; fi

if [ $count -eq 1 ] ; then cd $dirs ; exit ; fi

if [ $count -gt 1 ] ; then idx=1 ; for i in $dirs ; do echo $idx $i; idx=$((idx+1)) ; done ; fi

while true
do
    echo -n "enter directory number: "
    read choice
    if [ $choice -gt $count ]
    then
        echo "invalid choice"
    else
        idx=1
        for i in $dir
        do
            if [ $idx -eq $choice ]
            then
                cd $i ; exit
            fi
            idx=$((idx+1))
        done
    fi
done

答案 1 :(得分:1)

Z解决了在命令行上快速跳转到目录的更普遍的问题。它通过构建一个你cd到的目录数据库来做到这一点,并通过" frecency"对它们进行排名。 - 基于频率和新近度的综合得分。

访问某些目录后,您会使用z后跟一个或多个子字符串跳转到它们。例如,要访问我的gitolite管理存储库,我只需输入z gito