クイックソリューション
$ ls | perl -lne 'print if stat && -f _'
1
2
3
4
5
ファイル1
$ ls | perl -lne 'print if lstat && -f _'
ファイル1
シンボリック リンクと検索
デフォルトでは、GNUfindはシンボリック リンクを逆参照したりたどったりしませんが、findドキュメントにはこのポリシーを変更するスイッチが記載されています。
  リンクに関する find の動作を制御するオプションは次のとおりです。
  
  -P
  findシンボリック リンクを逆参照しません。これはデフォルトの動作です。このオプションは、コマンド ラインでファイル名の前に指定する必要があります。
  
  -H
  findシンボリック リンクを逆参照しません (逆参照されるコマンド ラインのファイル名の場合を除きます)。シンボリック リンクを逆参照できない場合は、シンボリック リンク自体の情報が使用されます。このオプションは、コマンド ラインでファイル名の前に指定する必要があります。
  
  -L
  find可能な場合はシンボリック リンクを逆参照し、それが不可能な場合は、シンボリック リンク自体のプロパティを使用します。このオプションは、コマンド ラインでファイル名の前に指定する必要があります。このオプションを使用すると、オプションと同じ動作も意味し-noleafます。後で-Hまたは-Pオプションを使用しても、 はオフになりません-noleaf。
  
  -follow
  このオプションは「式」の一部を形成し、ファイル名の後に指定する必要がありますが、それ以外は と同等-Lです。この-followオプションは、コマンド ラインでその後に表示されるテストのみに影響します。このオプションは非推奨です。可能であれば、-L代わりに使用する必要があります。
検索コマンドを Perl に変換する
標準ディストリビューションには、古い Unix システムfind2perlと互換性のあるユーティリティが付属しています。find
$ find2perl . -タイプ f | パール
./file1
代わりに、プレーン ファイル自体またはプレーン ファイルへのリンクのいずれかであるファイルを求めることができます。
$ find2perl . -フォロー -タイプ f | パール
./1
./2
./3
./4
./5
./file1
コード生成では、File::Find モジュールから渡されるfind2perlデフォルトのサブルーチンは次のとおりです。wantedfind
sub wanted {
    my ($dev,$ino,$mode,$nlink,$uid,$gid);
    (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) &&
    -f _
    && print("$name\n");
}
しかし、で-follow、私たちは得る
sub wanted {
    my ($dev,$ino,$mode,$nlink,$uid,$gid);
    (($dev,$ino,$mode,$nlink,$uid,$gid) = stat($_)) &&
    -f _
    && print("$name\n");
}
唯一の違いは、wanted呼び出しstatかかであることに注意してくださいlstat。後者は次のように文書化されています。
  lstat EXPR
  lstat
  
  関数と同じことstat(特別な_ファイルハンドルの設定を含む) を行いますが、シンボリック リンクが指すファイルの代わりにシンボリック リンクを統計します。システムにシンボリック リンクが実装されていない場合は、正常statに実行されます。詳細については、 のドキュメントを参照してくださいstat。
  
  EXPRを省略すると、stats $_.
からのサンプル出力が示すように、 filetestfind2perl演算子を使用して意図を表現できますが、 vs を選択してシンボリックリンクのセマンティクスについて正確にすることができます。statlstat
その面白い_トークン
上記_の簡単な解決策の最後にあるのは、lstatドキュメントに記載されている特別なファイルハンドルです。これらの高価なシステムコールを繰り返し行う必要がないようにするため、statまたはその方法として、最新の結果のコピーを保持します。、、、などのファイルテスト演算子も、このバッファーを埋めます。lstat-f-r-e-l
  いずれかのファイル テスト (またはstatorlstat演算子) に、1 つの下線で構成される特別なファイル ハンドルが指定されている場合、前のファイル テスト (またはstat演算子) の stat 構造が使用され、システム コールが節約されます。(これは では機能しません-t。そのことを覚えておいて、実際のファイルではなく、シンボリック リンクの stat 構造体に値lstatを残す必要があります。) (また、stat バッファが呼び出しによっていっぱいになった場合は、の結果)。例:-llstat-T-Bstat _
print "Can do.\n" if -r $a || -w _ || -x _;
stat($filename);
print "Readable\n" if -r _;
print "Writable\n" if -w _;
print "Executable\n" if -x _;