2017-01-18 14 views
0

10個の大きなファイルと10個の大きなディレクトリを表示するエイリアスを書きましたので、「アクセスできない」と「そのようなファイルやディレクトリはありません」エラーを隠すようにしました。linux bashエイリアスのエラー通知を非表示にする方法は?

alias big="echo 'Big Files:';find . -type f -print0 | xargs -0 du -h | sort -hr | head -10 2>/dev/null;echo 'Big Directories:';du -sh * | sort -hr | head -n10 2>/dev/null" 

感謝を

答えて

1

はまず/dev/null

du -sh * 2>/dev/null | sort -hr 
+1

ここに小さなバグが1つあります(オリジナルにも存在します): '-foo'という名前のファイルは' du'の引数として扱われます。 './*'と ' - *'のどちらかを使うとそれを防ぐことができます。 –

+0

もう一つの答えが正解でなければなりません。ここで私は尋ねられたものに答え、意図されたものには答えませんでした。 – CoconutBandit

+0

fooとは何ですか?このバグはduとfindの両方にありますか?ありがとう – user7203212

5

にごduコマンドの標準エラー出力ストリームをパイプしてみ助けのため:私が書いたエイリアス以下

代わりに関数を使用してください。この種のアプリケーションはであり、完全にという別名のユースケースです。関数は複数の行にあなたのロジックを書くことができます。実行時に条件付きのロジックを持つことができます(たとえば、関数に引数が与えられているかどうかを調べ、存在する場合は動作が異なります)。同じ構文で呼び出すことができます(どちらの場合でも呼び出すにはbig)。

第2回:最後のセグメントだけでなく、すべてのことをstderrにリダイレクトします。ここで

alias big='{ echo "Big Files:";find . -type f -print0 | xargs -0 du -h | sort -hr | head -10;echo "Big Directories:";du -sh * | sort -hr | head -n10; } 2>/dev/null' 

私たちが実行できます{ }にコード全体を包む、:(しかし、再び、あなたはいけない)エイリアスを使用し続けながら、

big() { 
    { # <-- open a block we can redirect 
    echo 'Big Files:' 
    find . -type f -exec du -h -- '{}' + | 
     sort -hr | 
     head -10 

    echo 'Big Directories:' 
    du -sh -- */ | 
     sort -hr | 
     head -n10 
    } 2>/dev/null # <-- close, and redirect, that block 
} 

また、同じことを行うことができます()内のコードをラップすることによって作成されるようにサブシェルを犠牲にせずにブロック全体にまたがる単一のリダイレクション(


その他の注意事項:

  • find -exec ... {} + POSIX指定され、(必要以上の子プロセスのそれ以上のインスタンスを産卵しないという点で)find ... -print0 | xargs -0と同じ効率利得を有し、それは避けるように、実際には、わずかにより効率的です外部のxargsプロセスが必要です。
  • "Big Directories"セグメントに*/を使用すると、グロブはディレクトリ名だけに展開されます。 --引数を先に使用すると、で始まり、名前が-であっても、そのポイント以降のすべての引数をファイル名またはディレクトリ名として解釈します。
  • MacOSでこの回答をテストしようとする人には、GNUソートに依存することに注意してください。私は個人的にgsortをmacports(port install coreutils)経由でインストールしていますので、テスト中にsortコマンドをラップするにはsort() { gsort "[email protected]"; }を使用してください。
関連する問題