我有一个功能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
}
答案 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
的行为的方式传递多个参数时,它仍以某种方式尝试分离目录。它还会过滤添加的选项。