LoCでファイルを並べ替える - wc -lからパイプするときに並べ替えが機能しません。

LoCでファイルを並べ替える - wc -lからパイプするときに並べ替えが機能しません。

LoCでファイルディレクトリを並べ替えようとしています。

しかし、sortラインをパイプで接続すると何もしないようです。

paths=`find ./src/ | egrep "\.(cpp|h)$"`
for path in $paths; do
wc -l $path | sort -n;
done

結果は次のとおりです(予約注文でソートされますが、find数字wcは無視されます)。

50 /a/a.cpp
10 /a/a.h
200 /b/b.cpp
13 /b/b.h
...

パイプの代わりにファイルにソートを使用する場合:

for path in $paths; do
wc -l $path >> test.txt;
done

sort -n test.txt

それする働く:

```bash
10 /a/a.h
13 /b/b.h
50 /a/a.cpp
200 /b/b.cpp
...

パイプラインバージョンが機能しないのはなぜですか?

ベストアンサー1

それぞれwcの出力を個別に、にsortパイプします。ループの出力全体を処理するためにパイプを移動すると、次のように動作します。

paths=`find ./src/ | egrep "\.(cpp|h)$"`
for path in $paths; do
wc -l $path
done | sort -n

find出力を繰り返さないでください。;また、フィルタリングされた出力egrepに使用する必要はありません。find以下を使用して上記のすべてのタスクを処理できます。

find ./src/ \( -name '*.cpp' -o -name '*.h' \) -exec wc -l {} \; | sort -n

または「全体」行があっても大丈夫ならより効率的に、

find ./src/ \( -name '*.cpp' -o -name '*.h' \) -exec wc -l {} + | sort -n

(ファイル名に改行文字が含まれていると、まだうまくいきません。)

おすすめ記事