2016-03-28 5 views
1

ちょっと、私はLinuxスクリプトを書いています。興味深い発見になりました。未知の量の空白をXの量に置き換えてください。

私は、ディレクトリ内のファイルをそのサイズでソートし、最大のものを出力するコマンドを持っています。これは、だから私は一人で最大のファイルサイズを取得し、それを印刷したい

895918591 8 -r-w-x 1 user01 xdf 1931 28 march 23:21 ./myscript.sh

の同類の中で何かが印刷されます

find . -type f -ls | sort -r -n -k7 | head -n 1

を次のようにコマンドがあります。これを分離するためにcut -d' ' -f2の問題があります。これは空の出力のみを残します。これは、スペースの量に一貫性がないためです。

だから私はこの

find . -type f -ls | sort -r -n -k7 | head -n 1 | tr -d [:blank:] | cut -d' ' -f2

ような何か問題があるをやってみました、これは今、私は、共通のセパレータでそれらを分離することはできませんすべての空白を削除します。だから私は、文字通りすべての空白スペースを置き換えて、空白スペースで置き換える方法があるのか​​と尋ねています。

もしそうでなければ、少なくともそのバイト数に達する他の方法はありますか?代わりにカットを使用しての

+1

代わりtr' 'の、と複数の空白のいずれかの発生を置き換えるために' sedのの/ \ S \ +// g''を使用1つのスペース。オプションで 'sed 's/\ s \ + /:/ g''をコロンで置き換えてください。 –

答えて

0

、あなたは

find . -type f -ls | sort -r -n -k7 | head -n 1 -printf %s 
1

代わりのcutあなたが使用することができ、あなたのディスプレイを制御できますprintfのコマンドを使用して試すことができますawk

find . -type f -ls | sort -r -n -k7 | head -n 1 | awk '{print $2}' 

あなたも回避することができますしかし、 headも使用する。awk

find . -type f -ls | sort -r -n -k7 | awk '{print $2; exit}' 
1

SedとAwkは、この種のものにとって素晴らしいツールです。 Sedは、Sedプログラムが受け取る各行の内容を変更する正規表現ベースの言語であり、Awkは入力を自動的にフィールドに分割する行指向のツールでもあります。

はセッドに1つのブランク( /\s+/の代替すべての一致)に空白の列をオンにするには:

$ find ... | sed 's/\s+/ /g' 

はただのAwkの各行の最初の「言葉」(nonspacesのシーケンス)を印刷するには:

$ find ... | awk '{print $1}' 

http://tldp.org/LDP/abs/html/sedawk.htmlこれらの言語を使い始めることができます。

0

あなたは間違っています。

任意の形式(find-lsオプションなど)の構文解析lsは悪いアプローチです。

lsの出力は使用しないでください。 lsは、ディレクトリメタデータを対話的に調べるためのツールです。 lsコードを出力して解析しようとすると、その結果が破損します。

この件についてさらにお読みになることを強くお勧めします。 Parsing lsを読んでください。


代わりに、次の関数を使用します。

# Usage: largest [dir] 
largest() { 
    local f size largest 

    while read -rd '' f; do 
     size=$(wc -c < "$f") 
     if ((size > largest[0])); then 
      largest=("$size" "$f") 
     fi 
    done < <(find "${1-.}" -type f -print0) 

    printf '%s is the largest file in %s\n' "${largest[1]}" "${1-.}" 
} 
+0

'wc -c'を使うと、ファイルサイズを見つけるのにかなり高価なようです。 'stat'はどうですか?皆さんお元気で。 – shellter

1

複数のスペースに変換するツールを一つだけがtr -sと呼ばれているします

  • tr
  • s
を絞り翻訳します

サンプル:

$ cat a 
hello this is  a sample text with  multiple spaces 
$ tr -s " " < a 
hello this is a sample text with multiple spaces 

あなたはその後、sed 's// /g'にX、ちょうどパイプにすべてのスペースを変換したい場合。

1

私はあなたが手で問題をoverthinkingていると思う:

find -type f -printf "%s\n"|sort -n|tail -n1 
関連する問題