在不降低所述命令功能的情况下传递命令别名/功能的最佳方法是什么?

时间:2013-08-28 13:48:23

标签: linux bash unix

我有一个功能ll,目前已扩展为:

function ll () 
{ 
    ls -lh --color "$@" | grep "^d";
    ls -lh --color "$@" | grep "^-" | grep -v "~";
    ls -lh --color "$@" | grep "^l"
}

这样做是将列出的文件夹排序为首先显示目录,然后是文件,然后是链接。但是,我发现这种方法会降低ls命令的功能,例如,如果我尝试调用ll /bin /tmp,我将从两个文件夹中混合使用文件。

是否有通用的经验法则来传递命令别名/功能,以免这些命令的完整功能减少?如果没有,我如何修复ll命令以保留排序,但ls的完整功能不会丢失?

请注意,我目前在我的系统上有bash版本3.2.25(1) - release(ls版本5.97),因此我无法使用--show-directories-first标记。

修改

这是我最终使用的功能,我稍微修改了它,以便ll可以在没有任何参数的情况下工作:

function ll () {
  if [ $# -eq 0 ]; then set -- .; fi
  for d; do
    ls -lh --color "$d"|awk '$1~/^d/{i=0} $1~/^l/{i=1} $1~/^-/{i=2} NF>2{print i OFS $0}' | sort -n -k1,1 | cut -d ' ' -f2-
  done
}

3 个答案:

答案 0 :(得分:5)

将每个参数分别处理为ll

function ll () 
{ 
    for d in "$@"; do
        ls -lh --color "$d" | grep "^d";
        ls -lh --color "$d" | grep "^-" | grep -v "~";
        ls -lh --color "$d" | grep "^l"
    done
}

答案 1 :(得分:3)

延伸到@chepner的回答:

我没有用ls多次运行grep,而是认为它可以在一个命令中与awk,sort,cut组合并获得相同的输出(目录首先是文件,然后是链接):

function ll () { 
    for d in "$@"; do
        ls -lh --color "$d"|awk '$1~/^d/{i=0} $1~/^l/{i=1} $1~/^-/{i=2} NF>2{print i OFS $0}'|sort -n -k1,1|cut -d ' ' -f2-
    done
}

答案 2 :(得分:1)

尝试此变体:

function ll { 
    local FILES=() OPTIONS=() A

    while [[ $# -gt 0 ]]; do
        case "$1" in
        --)
            FILES+=("${@:2}")
            break
            ;;
        -*)
            OPTIONS+=("$1")
            ;;
        *)
            FILES+=("$1")
            ;;
        esac
        shift
    done

    local -i FILES_COUNT=${#FILES[@]} I

    for (( I = 0; I < FILES_COUNT; ++I )); do
        A=${FILES[I]}
        [[ I -gt 0 ]] && echo
        [[ FILES_COUNT -gt 1 && -d $A/. ]] && echo "${A}:"
        # ls -lh --color "${OPTIONS[@]}" -- "$A" | grep "^total "
        ls -lh --color "${OPTIONS[@]}" -- "$A" | grep "^d";
        ls -lh --color "${OPTIONS[@]}" -- "$A" | grep "^-" | grep -v "~";
        ls -lh --color "${OPTIONS[@]}" -- "$A" | grep "^l"
    done
}

当以类似于ls的行为的方式传递多个参数时,它仍以某种方式尝试分离目录。它还会过滤添加的选项。