web-dev-qa-db-ja.com

findコマンドを操作して、「見つかった」ファイルがあるディレクトリを「検索」するにはどうすればよいですか?

したがって、findコマンドを使用して、システム内のmtime -xのすべてのファイルを検索しようとしています。これは行いますが、ファイルのディレクトリを「検索」しません。

find . -mtime -2 -exec rsync -av {} /destination/ \;

私はそれがそれらにフィードする可能性がある場合、それらがフィードするすべてのディレクトリを引き継ぐことができるかどうかを考えました:

rsync -a -f"+ */" -f"- *" source/ destination/

これはディレクトリツリーを引き継ぐのに魅力的ですが、ファイルをそこにプルしようとすると、それらは個別のディレクトリに移動せず、コピーしたメインディレクトリに流出します。

findコマンドを使用してディレクトリを見つける方法や、この問題を回避する別の方法を教えてください。

5
user768352

このコマンドラインには2つの問題があります。

find . -mtime -2 -exec rsync -av {} /destination/ \;`

パス名の転送

まず、単純なディレクトリではなく(単一の)ファイル名をrsyncに付ける場合は、宛先のファイル名だけでなく、パス全体を使用するように明示的に指示する必要があります。これには、オプション-Rを使用します。マニュアルページからrsync(1)へ:

-R、--relative相対パスを使用します。これは、ファイル名の最後の部分だけではなく、コマンドラインで指定されたフルパス名がサーバーに送信されることを意味します。これは、複数の異なるディレクトリを同時に送信する場合に特に便利です。たとえば、次のコマンドを使用した場合:rsync -av /foo/bar/baz.c remote:/ tmp/...これにより、リモートマシンの/ tmp /にbaz.cという名前のファイルが作成されます。代わりにrsync -avR /foo/bar/baz.c remote:/ tmp /を使用した場合、/ tmp/foo/bar/baz.cという名前のファイルがリモートマシン上に作成され、フルパスが保持されます。これらの追加のパス要素は「暗黙のディレクトリ」と呼ばれます(つまり、上記の例では「foo」ディレクトリと「foo/bar」ディレクトリ)。 [...]

その後、マンページはパスの操作方法を続行し、受信側にその一部のみが存在するようにしますが、ここでは範囲外です。

ディレクトリではなく、ファイルのみを検索します

次に、上記のように呼び出されたfindは、ファイルだけでなくディレクトリもレポートします。ソースとしてrsyncにディレクトリ名を指定すると、そのディレクトリ全体が宛先に同期されます。これは、findに対する追加のテスト-type f( "type must be file")を使用して防止できます。ただし、これによってディレクトリだけでなく、ソケット、名前付きパイプ、ブロックデバイスとcharデバイス、シンボリックリンクも除外されることに注意してください。シンボリックリンクの場合、代わりに-xtypeパラメータを使用できます。これにより、シンボリックリンクターゲットのタイプがチェックされます。

解決

したがって、変更されたコマンドラインは次のようになります。

find . -type f -mtime -2 -exec rsync -av -R {} /destination/ \;

これにより、過去2日以内に変更された現在のパス(-type f)内のすべてのファイル(.)(-mtime -2)、およびそれぞれのファイルがfindされます。実行(-execrsync、指定した名前のファイル({})を/destination/にコピーし、ほとんどの属性(-a)を保持して、詳細な出力を提供します(-v)および宛先(-R)でパス全体を複製します。

7
Dubu