クイックソリューション
$ 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
デフォルトのサブルーチンは次のとおりです。wanted
find
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 を選択してシンボリックリンクのセマンティクスについて正確にすることができます。stat
lstat
その面白い_
トークン
上記_
の簡単な解決策の最後にあるのは、lstat
ドキュメントに記載されている特別なファイルハンドルです。これらの高価なシステムコールを繰り返し行う必要がないようにするため、stat
またはその方法として、最新の結果のコピーを保持します。、、、などのファイルテスト演算子も、このバッファーを埋めます。lstat
-f
-r
-e
-l
いずれかのファイル テスト (またはstat
orlstat
演算子) に、1 つの下線で構成される特別なファイル ハンドルが指定されている場合、前のファイル テスト (またはstat
演算子) の stat 構造が使用され、システム コールが節約されます。(これは では機能しません-t
。そのことを覚えておいて、実際のファイルではなく、シンボリック リンクの stat 構造体に値lstat
を残す必要があります。) (また、stat バッファが呼び出しによっていっぱいになった場合は、の結果)。例:-l
lstat
-T
-B
stat _
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 _;