Linuxを使用して空ではない(サイズ> 0)すべてのファイルを(ls
を使用して)リストするにはどうすればよいですか?
GNU findと仮定して、find dirname -not -empty -ls
を使用します。
これは find の仕事ですlsは十分に強力ではありません。
find -maxdepth 1 -size +0 -print
-maxdepth 1
-これは、現在のディレクトリのみを検索するようにfindに指示し、すべてのサブディレクトリを検索するように削除するか、数値を2、3、またはそれ以上のレベルに変更します。
-size +0
これは、0
バイトより大きいサイズのファイルを探すようにfindに指示します。 0
は、任意のサイズに変更できます。
-print
は、見つかったファイルへのフルパスを出力するようにfindに指示します
編集:
追加の追加:おそらく上記の-type f
スイッチも追加する必要があります。これにより、findはファイルのみを検索します。また、以下のコメントに記載されているように、-print
スイッチは実際には必要ありません。
find dirname -type f ! -empty
ls -l | awk '{if ($5 != 0) print $9}'
ls
を使用したい場合は、awk
からの少しの支援が必要です。
Lsにはファイルをフィルタリングするオプションがほとんどありません。それはその仕事ではありません。ファイルのフィルタリングは、(グロビングを介した)単純なケースのシェルの仕事であり、複雑なケースの検索の仕事です。
Zshでは、L
グロビング修飾子を使用して、サイズが> 0のファイル(.
修飾子は通常のファイルに制限されます):
ls *(.L+0)
他のシェルのユーザーは、findを使用する必要があります。 GNU find(主にLinuxで見つかる)で):
find -maxdepth 1 -type f ! -empty -exec ls {} +
POSIX準拠の方法は次のとおりです。
find . -type f -size +0c -exec ls {} + -o -name . -o -Prune
ls
が単なる例ではなく、単に目視するだけの場合は、サイズで並べ替えることができます:ls -S
。
$ find /* -type f ! -size 0
ディレクトリだけでなく、空でないすべてのファイルが必要な場合は、より適切に機能します。
Bash 4.0以降
shopt -s globstar
shopt -s nullglob
for file in **/*; do test -f "$file" && [[ -s "$file" ]] && echo "$file"; done