4

我有一个功能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
}
4

3 回答 3

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
}
于 2013-08-28T14:00:16.173 回答
3

延伸自@chepner 的回答:

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

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
}
于 2013-08-28T14:49:13.537 回答
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. 它还会过滤添加的选项。

于 2013-08-28T14:17:04.453 回答