相対ファイルパス(「find」出力から)の前にある「./」の実際の用途は何ですか?

相対ファイルパス(「find」出力から)の前にある「./」の実際の用途は何ですか?

./file一部の相対ファイルパスがではなく表示されるのはなぜですかfile?たとえば、次のような場合:

find .

私は次のような結果を得ます。

./file1
./file2
./file3

道路をより混乱させることに加えて、実際の目的は何ですか?何度も事故を防ぐことができたわけではありません。どちらも相対パスであり、cat ./file1同じように機能しますcat file1

findこの動作は、コマンドまたは一部のシステム全体のCライブラリで発生しますか?

./fileわかりました、なぜforコンストラクタを使用するのかを理解します(代わりにあるかどうかを-exec確認するため)。... | xargs rm ./-i... | xargs rm -i

しかし、どのような状況でステートメント./がないと-print問題が発生しますか?

私は何かを破る文章を作成しようとしています。

touch -- -b -d -f -i
find -printf '%P\n' | sort

-b
-d
-f
-i

すべてが正常です。

疑問に思って、-printこの問題を証明するステートメントをどのように構成できますか?

ベストアンサー1

この動作はで発生findしますPOSIXで指定:

末尾の<スラッシュ>文字を含むオペランドは、指定されたとおりに評価する必要があります。階層で見つかった他のファイルへのすべてのパス名には、現在のファイルへの接続を含める必要があります。オペランド、現在のパスオペランドが1で終わらない場合<スラッシュ>オペランド。

デフォルトのアクションは、-printフルパス名を標準出力として印刷することです。

findコマンドラインで指定されたパスから始まり、見つかったファイルのパスを出力します。

find .

とサブディレクトリでファイルをfind検索し、;で始まる結果を表示するように要求しました。../

find foo

同じことをしますが、最初からfoo、そして最初から結果を生み出しますfoo/

find特に予防するためのものではないと思います。質問ファイル名にはプレフィックスが付いていません。代わりに一貫性のためにそうします。引数で指定されたパスに関係なく、の出力は-print常にそのパスから始まります。

GNU実装では、代わりにinを使用してfind印刷ファイルの先頭から初期パスを削除できます。たとえば、orを使用すると、これらのファイルに代わるorを取得できます。-printf '%P\n'-printfind foo/bar -name file -printf '%P\n'find . -name file -printf '%P\n'dir/filefoo/bar/dir/file./dir/file

より一般的には、./プレフィックスはエラーを防ぐのに役立ちます。例えばたとえば、ファイル名がダッシュで始まる場合、ファイル名は-f削除rm -fされませんがrm ./-f削除されます。

シェルまたはexec*p()標準のC関数(および他の言語の対応する機能)を使用してコマンドを実行するときにコマンド名にが含まれていない場合、コマンドパスは相対パス(現在の作業ディレクトリ)として解釈されるのではなく照会されます/$PATH)。複数のシェル/特殊組み込み関数(POSIX準拠の実装を含む)の引数.にも同じことが当てはまります。この場合、同じ相対パスを指定する別の方法である代わりにを使用してください。しかし、aを使用するのは通常、現在の作業ディレクトリに格納されているコマンドを呼び出す方法です。sourcesh./cmdcmd/

おすすめ記事