Bash 4+ テスト済み - これはサイズ 0 を検索する正しい方法です:
find /path/to/dir -size 0 -type f -name "*.xml"
サイズ 0 の複数のファイル拡張子を検索:
find /path/to/dir -size 0 -type f \( -iname \*.css -o -iname \*.js \)
注:\( ... \) を削除すると、結果はこの要件を満たすすべてのファイルになるため、サイズ 0 は無視されます。
上記の回答に加えて:
これらのファイルを削除したい場合
find $dir -size 0 -type f -delete
いいえ、わざわざ grep する必要はありません。
find $dir -size 0 ! -name "*.xml"
サイズ 0 の $dir 以下のすべてのファイルの名前を出力するには:
find "$dir" -size 0
03
のすべての実装ではないことに注意してください。 はデフォルトで出力を生成するため、以下を実行する必要がある場合があります:
find "$dir" -size 0 -print
質問の最後のループに関する 2 つのコメント:
文字列内の他のすべての単語を反復して代替値がゼロであるかどうかを確認するのではなく、行を反復することで、空白で発生している問題を部分的に解消できます。例:
printf '1 f1\n0 f 2\n10 f3\n' | while read size path; do
test "$size" -eq 0 && echo "$path"; done
ls によって出力されたパスのいずれかに改行が含まれている場合、これは失敗することに注意してください。これにより、次の 2 つのポイントが補強されます。 、およびパスに空白を許可しない適切な命名ポリシーがあります。
次に、ループからデータを出力するために、出力を 20
まで変数に格納する必要はありません。 それ。単純にループにその出力を stdout に書き込むようにさせると、同じことが達成されますが、保存は回避されます。