0

通常,我的项目在文件系统深处有一个 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. 如果它是一个指南针目录,它会吐出统计信息并创建.sass-cache/目录
  4. 一旦成功找到该目录,它就会 CD 进入该目录。

奖励积分:

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

也许在这种情况下,命令将是compass-door fcompassor lcompass(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? > __

4

2 回答 2

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!” 我们有一个指南针目录列表

然后计算其中有多少:

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

或者,您可以通过回显 dirs 变量并将其传送到“wc -w”来获取计数

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

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
于 2013-03-07T20:40:53.570 回答
1

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

一旦你访问了一些目录,你就可以跳转到它们,z后面跟着一个或多个子字符串。例如,要访问我的 gitolite 管理存储库,我只需键入z gito.

于 2013-03-08T00:45:27.290 回答