1

現在のディレクトリ内のファイルの行の最大長を一覧表示しようとしていますが、コマンドの動作に問題があります。{}私のexecコマンドで中括弧をエスケープすることに問題があると思います。{}大量の find exec escape answer をグーグルで調べた後、exec コマンドで括弧をエスケープする方法について何も見つけることができませんでした。私は何が欠けていますか?

find . -iname *.page -exec awk '{if(length($0) > L) { LINE=$0;L = length($0)}} 
END {print LINE"|"L}' {}\; | sort
4

2 に答える 2

2

元のコマンドには複数の問題があり、どれもエスケープしていません{}{}最初の問題は、 と の間にスペースが必要なこと\;です。2 番目の問題は、シェルが find iname パラメータでワイルドカードを展開する方法に関連しています*.page

無料の BSD フォーラムから

"*" は、コマンドラインが find(1) に渡される前にシェルによって展開されます。ディレクトリに項目が 1 つしかない場合は、機能します。ディレクトリに複数の項目がある場合、コマンド ライン オプションが正しくないため失敗します。

*.page を引用符で囲むと、問題が解決します。最終版は

find . -iname '*.page' -exec awk '{if(length($0) > L) 
{ LINE=NR;L = length($0)}} END {print L"|"FILENAME":"LINE}' {} \; | sort -n

行番号付きの各ファイルの最長行のソート済みリストを出力します

220|./Example1.page:157
206|./Example2.page:203
于 2013-06-07T00:42:11.990 に答える
1

ファイルごとに awk を実行したいのですね。

ホーム ディレクトリにスクリプト t.sh を作成します。

awk '{if(length($0) > L) { LINE=$0;L = length($0)}} 
END {print LINE"|"L}' "$1" 

コマンドライン:

find . -iname *.page -exec ~/t.sh {} | sort

あなたのawkスクリプトについてはよくわかりませんが、それが必要だと思うので、今のところそれを伝えましょう。

于 2013-04-29T01:21:38.217 に答える