現在のディレクトリの下のすべてのレベルを検索するときにそれがどのように行われるかを確認するには、標準ツールの出力を検討してfind2perl
ください。
$ find2perl . -type f -size 0c
#! /usr/bin/perl -w
eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
if 0; #$running_under_some_shell
use strict;
use File::Find ();
# Set the variable $File::Find::dont_use_nlink if you're using AFS,
# since AFS cheats.
# for the convenience of &wanted calls, including -eval statements:
use vars qw/*name *dir *prune/;
*name = *File::Find::name;
*dir = *File::Find::dir;
*prune = *File::Find::prune;
sub wanted;
# Traverse desired filesystems
File::Find::find({wanted => \&wanted}, '.');
exit;
sub wanted {
my ($dev,$ino,$mode,$nlink,$uid,$gid);
(($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) &&
-f _ &&
(int(-s _) == 0)
&& print("$name\n");
}
上記のコードを実行します
$ find2perl . -type f -size 0c | perl
この知識を状況に適応させる
my @files = grep -f $_ && -s _ == 0, glob "*";
print @files, "\n";
または with への 1 回の呼び出しprint
で
print +(grep -f $_ && -z _, <*>), "\n";
_
最新の結果のキャッシュされたコピーを保持する特別なファイルハンドルを使用するstat
と、1 つで十分なオペレーティング システムに 2 つのトラップを作成することを回避できます。ファイルがプレーン ファイル ( -f
) であることを確認する追加のチェックが必要であることに注意してください。これは、ゼロ サイズ チェック (-s _ == 0
または-z _
) が一部のファイル システムの空のディレクトリに対して true を返すためです。