Shell-Script

如何按類/指標(如 ls –classify)然後按名稱列出文件?

  • August 9, 2015

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,sortls本身的組合來接近:

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它自己,列印到多列變得容易得多。

引用自:https://unix.stackexchange.com/questions/222063