
./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'
-print
find foo/bar -name file -printf '%P\n'
find . -name file -printf '%P\n'
dir/file
foo/bar/dir/file
./dir/file
より一般的には、./
プレフィックスはエラーを防ぐのに役立ちます。例えばたとえば、ファイル名がダッシュで始まる場合、ファイル名は-f
削除rm -f
されませんがrm ./-f
削除されます。
シェルまたはexec*p()
標準のC関数(および他の言語の対応する機能)を使用してコマンドを実行するときにコマンド名にが含まれていない場合、コマンドパスは相対パス(現在の作業ディレクトリ)として解釈されるのではなく照会されます/
。$PATH
)。複数のシェル/特殊組み込み関数(POSIX準拠の実装を含む)の引数.
にも同じことが当てはまります。この場合、同じ相対パスを指定する別の方法である代わりにを使用してください。しかし、aを使用するのは通常、現在の作業ディレクトリに格納されているコマンドを呼び出す方法です。source
sh
./cmd
cmd
/
答え2
一般的なファイルについて話すとき、実際の用途はありません。しかし、実行ファイルについて話すときは意味があります。実行している場合(file1
現在のディレクトリにある場合):
file1
シェルは、PATH変数のすべてのパスから実行可能ファイルを検索します。このファイルは、PATHに次のエントリがある場合にのみ実行されます(:.:
現在のディレクトリはPATH検索にあります)。非常に賢明ではない設定の代わりに、次の方法file1
で現在のディレクトリで実行できます。
./file1
答え3
Linuxの多くのコマンドは-
stdinを表す特別なファイルとして受け取られるため、実際に名前がstdinのファイルを表すために使用する必要が-
あります./-
。
また、パラメータの場合は、likeで始まるファイル名を使用するにはを-
使用する必要があります。-
--file
./--file
-
grep -e --pattern
「-」という名前のファイルを「減算」する方法は?