Shell-Script
如何按類/指標(如 ls –classify)然後按名稱列出文件?
ls --clasify
將指示符(之一*/=>@|
)附加到條目。我想將同一類/指標的條目組合在一起。我只能找到將它們
ls --group-directories-first
分組/
在一起的方法,我怎樣才能將執行檔*
、符號連結@
、管道|
和套接字分組=
?
ls
不是必需的,歡迎任何骯髒的黑客。但至於輸出樣式,我想要一個帶有指示器的多列彩色輸出,類似於所做的ls -C --color -F
那樣。
如果歡迎骯髒的黑客,以下可能會接近:
ls -C --color -F -1 | rev | sort | rev
本質上:
rev
首先獲取最後一個字元- then
sort
,現在將首先使用最後一個字元- 然後
rev
再次取回原來的行不幸的是,這具有單列輸出。您可以應用
column
它來獲得多列輸出,但由於非列印字元,列會變得混亂:$ ls -C --color -F /proc/self/ -1 | rev | sort -i | rev | column -x fd/ task/ fdinfo/ attr/ ns/ net/ cwd@ exe@ root@ sched cmdline oom_score oom_score_adj oom_adj stack syscall mem comm statm wchan environ mountinfo io pagemap cgroup autogroup coredump_filter clear_refs maps numa_maps smaps mountstats limits mounts status stat schedstat cpuset auxv personality
而且,當然,它假設了一些警告:
- 文件名中沒有換行符
- 文件名中沒有任何
ls
標記字元一個 bash 函式,使用
find
,sort
和ls
本身的組合來接近:lsc () ( [[ -z $1 ]] && set . for path do [[ -d $path ]] || { ls -CF --color "$path"; echo; continue; } (( $# > 1 )) && printf '%s:\n' "$path" find "$path" -maxdepth 1 -mindepth 1 ! -iname '.*' -printf "%y %p\0" | while IFS= read -d '' -r entry do ftype="${entry:0:1}" fname="${entry:2}" [[ $ftype == f && -x $fname ]] && ftype=x printf "$ftype $fname\0" done | sort -z -k1 | sed -z 's/^. //; s:.*/::' | xargs -0 bash -c 'cd "$0"; ls -CFUd --color "$@"' "$path" (( $# > 1 )) && echo done )
通過使用
ls
它自己,列印到多列變得容易得多。