Bashスクリプトで現在のディレクトリにディレクトリを水平に入力する方法は?

Bashスクリプトで現在のディレクトリにディレクトリを水平に入力する方法は?

だから現在のコードは次のようになります:scan.h

#!/bin/bash
while IFS= read -r line;
do
    byte=$(stat -c%s "$line");
    echo "$line : $byte";
done< <(ls *.$1)

UNIXでは、コードを実行すると次のように実行されます。

./scan.sh cpp
arraysum.cpp : 359
countLines.cpp : 1199
createtext.cpp : 240
multiproc1.cpp : 196
myWc.cpp : 1230
test.cpp : 193

これは、現在のディレクトリ内のすべての.cppファイルとそのバイト数が表示されるために予想される現象です。しかし、カタログフォルダ内の他のファイルも探したいのですが、側面からそのファイルにアクセスする方法がわからないようです。

注:また、疑問なことに、バイトサイズに基づいて印刷ステートメントを構成できますか?

ベストアンサー1

通常、findディレクトリを再帰的に検索します。

find . -name '*.cpp'

GNUがある場合は、findファイル名とサイズをバイト単位で直接印刷できるため、呼び出しを回避できます。stat

find . -name '*.cpp' -printf '%f:%s\n'

順序を変更しても構わない場合は、明示的に並べ替え可能な方法で結果を出力できます。たとえば、サイズごとに高い順にソートされます。

find ../src -name '*.cpp' -printf '%s:%f\n' | sort -t: -rn

たとえば、Awk を使用してソート後、いつでもフィールドを変更できます。たとえば、上位5つの結果のみを選択できます。

find . -name '*.cpp' -printf '%s:%f\n' | sort -t: -rn | awk -F: 'NR==6 {exit} {print $2 " : " $1}'

最後に、「正当な」ファイル名を安全にしたい場合(改行を含む)、すべてをnullで終了します。

find . -name '*.cpp' -printf '%s:%f\0' | sort -t: -zrn | awk -vRS='\0' -F: 'NR==6 {exit} {print $2 " : " $1}'

おすすめ記事