`find`に相対パスを返すようにするにはどうすればよいですか?

Aug 24 2020

私はこのタスクを見つけます:

ディレクトリ内のすべてのファイルを検索/srv/SAMPLE002するファイルの拡張子を持ちます.tar/opt/SAMPLE002/toBeCompressed.txtすでに作成されているファイルに、一致するファイル名のリストを1行に1つずつ書き込みます。あなたが使用して、各ファイルへの相対パスを指定していることを確認し/srv/SAMPLE001、相対パスのベースディレクトリとして。

にディレクトリを作成SAMPLE001SAMPLE002ましたsrv。でSAMPLE002私は.tar拡張子を持つ5つのファイルを作成しました。タスクのこの部分に問題があります。

あなたが使用して、各ファイルへの相対パスを指定していることを確認し/srv/SAMPLE001、相対パスのベースディレクトリとして。

私はこのようにしようとします:

 find /srv/SAMPLE001/../SAMPLE002  -type f -name "*.tar"

それは私の仕事に良い解決策ですか?私が意味する:相対的な各ファイルへのパスを。多分私よりも良い解決策があります。

回答

2 KamilMaciorowski Aug 24 2020 at 21:08

いいえ。コマンドから取得するパスは相対的なものではありません。

このコマンドは、のアクションを明示的に指定しないためfind、暗黙的-printに使用されます。-printパス名を出力します。パス名は次のように作成されます。

[…]各パスオペランドは、すべての末尾文字を含め、提供されたとおりに変更されずに評価されるものとします。階層内で検出された他のファイルのすべてのパス名は、現在のパスオペランドの連結、現在のパスオペランドが1で終わっていない場合は<スラッシュ>、およびパスオペランドに関連するファイル名で構成されます。[…]

つまり/srv/SAMPLE001/../SAMPLE002、唯一のパスオペランド(ステートポイント)として指定した場合-print、この正確な文字列で始まる行のみを取得できます。

次に、相対パス名の定義を確認します。

相対パス名
<スラッシュ>文字で始まらないパス名。

/使用したパスオペランドは/。で始まるため、コマンドから取得できるものはすべて(<スラッシュ>文字)で始まる必要があります。次に、定義により、これらのパス名は相対的ではありません。相対パス名を取得する唯一の方法find … -printは、相対パスオペランド(開始点)を指定することです。

あなたの場合、それは次のようになります:

cd /srv/SAMPLE001 && find ../SAMPLE002 -type f -name "*.tar"

(失敗&&した場合cd)。これで、すべてのパス名は../SAMPLE002。で始まる必要があります。探している.tarファイルへのパスは../SAMPLE002/。で始まります。定義上、それらは相対的です。

定義は非常に簡潔です。相対性がどこから来ているかを知るには、* nixがパスを解決する方法を知る必要があります。あなたがこれを知っているなら、あなたはそれに同意するでしょう

/srv/SAMPLE001/../SAMPLE002/foo.rar

foo.rar現在の作業ディレクトリが何であっても、同じを指します。だが

../SAMPLE002/foo.rar

現在の作業ディレクトリに(依存して)依存します。後者のパスfoo.rar、現在の作業ディレクトリに応じて、右を指す場合とそうでない場合があります。これが相対的であるという点です。現在の作業ディレクトリがである/srv/SAMPLE001場合、パスは正しいファイルを指します。

/srv/SAMPLE001/存在しなかった場合、または存在/srv/SAMPLE001/..しなかった場合(SAMPLE001通常のファイルなど)は、/srv/SAMPLE001/../SAMPLE002/foo.rar解決できなかったことに注意してください。この/srv/SAMPLE001場合、これが唯一の依存関係です。/srv/SAMPLE001/../SAMPLE002/foo.rarただし、依存関係は相対パスを作成しません。


元のコマンドはまったく書き込みません/opt/SAMPLE002/toBeCompressed.txt。適切な演算子を使用して、からの出力をリダイレクトしますfind。例えば:

cd /srv/SAMPLE001 && find ../SAMPLE002 -type f -name "*.tar" >/opt/SAMPLE002/toBeCompressed.txt