
私は次のコマンドを使用して、現在のディレクトリの下にある任意の深さで最大の 10 個のファイルを一覧表示しています。
find -type f -size +10M -exec ls -gGsSh1 {} + | awk 'NR<=10 {print $0}'
(私はのawk
代わりにを使っています。head
パイプ破損エラーリストが長すぎる場合
うまく機能しますが、毎回覚えて入力するのは明らかに困難です。これを .bash_aliases に入れてみましたが、機能しません (10 行の空行が出力されます)。
less
の代わりにを使用するとawk
、出力は正しく表示されますが、上位のファイルだけでなく、10MB (下限値) より大きいファイルのリスト全体がサイズ順に表示されてしまいます。
では、エイリアス コマンドの一部として choke が実行される原因は何でしょうかawk
(それが実際に問題であると仮定した場合)。また、これを修正するにはどうすればよいでしょうか。
答え1
このコマンドをエイリアスとして使用すると、$0
単一引用符で保護されなくなり、シェル名に変換されます。次のコマンドはそれを示しています。
$ alias F="echo '$0'"
$ F
bash
シェル名(おそらくbash
)は未設定ですawk変数名、空行につながります。
シェルの拡張から保護する 1 つの方法は、$0
次のようなものを使用することです。
alias F="find -type f -size +1k -exec ls -gGsSh1 {} + | awk 'NR<=10 {print \$0}'"
ただし、これは$0
役に立たないので、ステートメントから削除することができますawk
。
find -type f -size +10M -exec ls -gGsSh1 {} + | awk 'NR<=10 {print}'
awk
選択した行を印刷するのはデフォルトの動作なので、さらに進んでブロック全体を削除することもできます。
find -type f -size +10M -exec ls -gGsSh1 {} + | awk 'NR<=10'
あるいは、head
エラー メッセージを破棄してそのまま使い続けることもできます。
find -type f -size +10M -exec ls -gGsSh1 {} + 2>&1 | head