lsコマンドの色をfindまたはduの出力とマージする方法は?


1

cwdのファイルとフォルダーのサイズをリストする簡単なエイリアスがあります。

(この場合のドットファイルを含み、ゼロサイズを無視します)

du -sh .[!.]* * | sort -hr | grep -v '^0'

findでも同様に達成できます:

find .[!.]* * -maxdepth 0 -exec du -sh {} \; | sort -hr | grep -v '^0'

出力例:

// .ssh & .byobu are folders - .zsh* are files
// currently not able to distinguish them by type

... 
32K     .zshrc
25K     .ssh
20K     .zcompdump
19K     .byobu
...

出力のファイル/ディレクトリをlsの色に一致させるにはどうすればよいですか?(LS_COLORS)


それはでない-私はこれが動作しない理由を知ることができないprint、しかしで台無しにされますsystemdu -sh .[!.]* * | sort -hr | grep -v '^0' | awk '{print $1;system( "ls -d --color '$2'") }'
ポール

これは間違いなく正しい方向を指します...出力は(すべてlsのdir色で)色付けされます...しかし、すべてのファイル/フォルダーは「/ n」に変換されます。。あなたの努力に感謝します-ソリューションはおそらくトリッキーなsed / awkになるでしょう!:)
ニコライフレー

grepで利用可能な--colorオプションを使用することもできます。-iname "t *" | du -sh * | grepスタッフ--color = auto`
nitin

ありがとう-私はすでにgrepのエイリアスを持っていますgrep --color=auto... grepは出力で検索文字列/パターンを強調表示します... LS_COLORSを使用して出力でファイルとフォルダーを分割しません。とにかくヒントをありがとう:)
ニコライ

回答:


1

このzshスクリプトは解析し$LS_COLORSます。statすべてのファイルを呼び出すだけでよいlsため、すべてのファイルを呼び出す下部のソリューションよりもはるかに高速です。また、スペースを含むファイルを正しく処理します。(\nまたは、ファイル名で\tまだ許可されていません

ただし、実装は完全ではありません。ファイルモード文字列の最初の文字(たとえばlrwxrwxrwx、シンボリックリンク)またはファイル拡張子によって識別できるさまざまなファイルタイプの色のみを含めました。つまり、世界で書き込み可能な許可、suidまたはstickyビットは特別に色付けされていません。それらを含めることも簡単です。

source以下を実行ducし、色付きのdu出力に新しいシェル関数を使用します。

zmodload -F zsh/stat b:zstat

function duc() {

  emulate zsh 
  setopt no_nomatch interactivecomments           # no_nomatch is necessary, to prevent error in "do .* *" if there are no dotfiles

  typeset -a aline
  typeset -A lscols
  local dircols acolor

  for i (${(s.:.)LS_COLORS}) {                    # split $LS_COLORS at ":"
    aline=(${(s:=:)i})                            # split every entry at "="
    lscols+=(${${aline[1]}/*.} ${aline[2]})       # load every entry into the associative array $lscols
  }

  duout=$(du -sh .* * 2> /dev/null | grep -v '^0' | sort -hr)
  for i (${(f)duout}) {                           # split output of "du" at newlines
    aline=(${(ps:\t:)i})                          # split every entry at \t
    zstat -s +mode -A atype ${aline[2]}           # determine mode (e.g. "drwx------") of file ${aline[2]}
    case ${${atype[1]}[1]} in                     # ${${atype[1]}[1]} is the first character of the file mode
      b)   acolor=$lscols[bd] ;;
      c|C) acolor=$lscols[cd] ;;
      d)   acolor=$lscols[di] ;;
      l)   acolor=$lscols[ln] ;;
      p)   acolor=$lscols[pi] ;;
      s)   acolor=$lscols[so] ;;
      -)   acolor=${lscols[${${aline[2]}:e}]};      # ${${aline[2]}:e} is the current file extention
           [[ -z $acolor ]] && acolor=$lscols[fi]   # unrecognized extention
           [[ -z $acolor ]] && acolor=00            # sometimes "fi" isn't set in $LS_COLORS, so fall back to normal color
           ;;
      *)   acolor=00 ;;
    esac
    print -n -- "${aline[1]}\t"        # print size (taken from du output)
    print -n "\\e[4${acolor}m"         # activate color
    print -n ${aline[2]}               # print file name
    print "\\e[0m"                     # deactivate color
  }
}

これも私の古いスクリプトですzsh。すべてのファイルに対して単一のlsコマンドが発行されるため、おそらく不必要に複雑で、本当に遅いです:

du_colored() {
  typeset -a duout
  duout=($(du -sh .* * | sort -hr | grep -v '^0'))
  for i ({1..$#duout..2}) {
    print -n "${duout[$i]}\t"
    ls -d --color ${duout[$(($i+1))]}
  }
}
  • .*中にはzshなりません一致する...、しかし、のようなファイル..fooを逃したことになります.[!.]*
  • typeset -a 配列を宣言します
  • forループは配列に対応し、$i2のステップで1以降の値を取ります

警告空白のあるファイルがあると、これはひどく壊れます...私は現時点でより良い考えを持っていません。


これが最初のほぼ機能するソリューションであるため、+ 1。すべてのファイルに対してlsを実行するのはやり過ぎのようです。duの出力で、2番目の文字列(colorのないfolder / filename)に対して1つのls -a --colors(colorsを出力)を単純に照合する方が、パフォーマンスが向上します。それを達成しようとしているが、まだ十分な方法を見つけることができません:/
ニコライフレーリヒ

ls -a --color | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"色を削除します-では、du出力を色付きの出力に置き換えるにはどうすればよいls -a --colorですか?:)
ニコライフレーリヒ

@nifr:$LS_COLORS直接解析する別のスクリプトを追加しました。これは、実行する代わりにすべてのファイルを統計するだけでよいため、昨日の深夜以降のハックよりもはるかに高速に実行されlsます。
mpy

素敵な追加ありがとう-昨日の夜のセッションでbashのソリューションを一緒にハックしました-以下に投稿します、多分あなたはそれを確認できます:)
ニコライフレーリヒ

1

これは私がbashのために思いついたものです-pvを使用して出力の進行状況を表示します

folder_size (){
  # read ls --color output into ls_colored_array 
  # thereby remove symlinks (@) and remove (/ and *) from folders and files

  ls -AF --color | grep -v @ | sed s'/[/\,*]$//'| xargs -n1 -L1 | read -d '\n' -r -a ls_colored_array

  # - loop over the array and issue du -sh for every element
  # - exchange du's ouput with ls's 
  # - run loop through pv with line option and
  #    size set to array-length showing progress
  # - finally sort the output using sort

  for i in "${ls_colored_array[@]}"; do
    echo -n "${i}" | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" | xargs -n1 -0 du -sh | awk -v i="$i" '{ printf "%-10s ", $1; $1=""; print i }'
  done | pv -pls"${#ls_colored_array[@]}" | sort -hr
}

スクリプトをワンライナーに変更できるようになりました...しかし、10個の最大のファイル/フォルダーまたはフォルダーのみにフラグを追加して、機能を改善します。


これは素晴らしい解決策です。特にプログレスバーのある部分はそのために+1です。:)しかし、read -d '\n' -r -a ls_colored_array <<< $(ls -AF --color | grep -v @ | sed s'/[/\,*]$//'| xargs -n1 -L1)プレーンなbashで動作するように読み取り行を変更する必要がありました(関連:superuser.com/questions/173337/…)。残念ながら、このスクリプトはファイル名の空白で壊れています。($ls_colored_array配列をforループに直接渡すのではなく、カウンターを使用してすべての要素にアクセスする必要があると思います)。
mpy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.