1

ls からの出力をソートしようとしています。私が行っている順序は次のとおりです。

  • _ で始まる名前のディレクトリ
  • + で始まる名前のディレクトリ
  • すべてのソフト リンク (いくつかのドット ファイルを含む場合があります)
  • 残りのすべての .files
  • 残りのすべてのディレクトリ
  • ほかのすべて

すべてがこれらの「サブリスト」内でアルファベット順にソートされます。現時点では、find コマンドを何度も使用して、上記の基準を満たすファイルを検索しています。次に、出力を find から sort にパイプし、ソートされたリスト全体を ls に渡します。

#!/bin/bash

find1=`find . -maxdepth 1 -name "_*" -type d -printf "%f\n" | sort`
find2=`find . -maxdepth 1 -name "+*" -type d -printf "%f\n" | sort`
find3=`find . -maxdepth 1 -type l -printf "%f\n" | sort`
find4=`find . -maxdepth 1 -name ".*" -type f -printf "%f\n" | sort`
find5=`find . -maxdepth 1 \( ! -name "."  \) -name ".*" -type d -printf "%f\n" | sort`
find6=`find . -maxdepth 1 \( ! -name "_*" \) \( ! -name "+*" \) \( ! -name ".*" \) \( ! -type l \) -printf "%f\n"`
find="$find1 $find2 $find3 $find4 $find5 $find6"
ls -dfhlF --color=auto $find

これはスペースを含む名前を処理せず、全体的に少し過剰に見えます。これを行うためのより良い方法があると確信しています。何か案は?

4

1 に答える 1

0

これはうまくいきますか?ファイルは指定した順序で印刷されますが、カラーで印刷されません。そのためには、名前をパターン マッチングする前に、名前から ANSI コードを削除する必要があります。そのままでは、スペースが埋め込まれたファイル名を処理しますが、改行や制御文字が埋め込まれたようなひどく病理学的な名前は処理しません。

スクリプトはかなり自明だと思いますawkが、明確にしたい場合はお知らせください。出力が開始BEGINされる前に行が処理され、すべての出力が消費された後に行が処理されます。他の行はオプションの条件で始まり、その後に中括弧で囲まれた一連のコマンドが続きます。コマンドは、条件に一致する行 (のみ) で実行されます。lsEND

ls -ahlF --color=none | awk '
  BEGIN { name_col = 45 }
  { name = substr($0, name_col) }
  name == "" { next }
  /^d/ && substr(name, 1, 1) == "_" { under_dirs = under_dirs $0 "\n"; next }
  /^d/ && substr(name, 1, 1) == "+" { plus_dirs = plus_dirs $0 "\n"; next }
  /^l/ { links = links $0 "\n"; next }
  /^[^d]/ && substr(name, 1, 1) == "." { dot_files = dot_files $0 "\n"; next }
  /^d/ && substr(name, 1, 1) == "." { dot_dirs = dot_dirs $0 "\n"; next }
  { others = others $0 "\n" }
  END { print under_dirs plus_dirs links dot_files dot_dirs others }
'
于 2013-08-31T13:14:01.417 に答える