最も深いすべてのサブディレクトリにファイルを繰り返しコピーします。

最も深いすべてのサブディレクトリにファイルを繰り返しコピーします。

単一のファイルをツリー構造の最も深いサブディレクトリのすべてにコピーしようとしています。次のように想像してみてください。

bar
dir1
 |  |
 |  +--dir2
 |    |
 |    +--dir3
 |  +--dir4
 |    |
 |    +--dir5
 |  +--dir6
 |    |
 |    +--dir7

次のように、「bar」を最も深いサブディレクトリにのみコピーしたいと思います。

bar
dir1
 | +--dir2
 |   |
 |    +--dir3
 |     | 
 |     +-- bar
 | +--dir4
 |   |
 |   +--dir5
 |     | 
 |     +-- bar
 | +--dir6
 |   |
 |   +--dir7
 |     | 
 |     +-- bar

ファイルは時々中間ディレクトリに表示されるため、この問題を解決する方法がわかりませんが、最も深いサブディレクトリをターゲットにする方法が見つかりません。

編集:私はこの問題を解決しようとしました。何らかの理由で、最も深いディレクトリだけでなく、すべてのディレクトリに一貫してコピーされません。

find . -exec cp -r bar {} \; -type d -links 2

答え1

bar回避策:含まれているディレクトリから

find . -type d -links 2 -exec cp bar {} \;

最初の試み

find . -exec cp -r bar {} \; -type d -links 2

構文エラーはありませんが、動作が予想したものとは異なります。フィルタはフィルタの前に-execあるため、フィルタは適用されず、通常のファイルだけでなくディレクトリも含め、現在のディレクトリの下のすべてのエントリがインポートされます。信じられない場合は、出力を確認してください。-type-linksexec

find . -exec echo X{}X \; -type d -links 2 -exec echo Y{}Y \;

2つのファイルの間にすべてのファイルが一覧表示されますが、2つのファイルの間に正しいファイルのみがリストさXれていることがわかります。これは中間ディレクトリにも表示される理由を説明します。dir{3,5,7}Ybar

また、この-rオプションは再帰コピーを有効にします。コピーされる内容は通常のファイル(bar)なので、-r必要ありません。

答え2

あなたはそれを使用することができます:

find . -type d -links 2 -exec cp  file  {} \;

2つのハードリンクがあるディレクトリを見つけて、ファイルをその特定のディレクトリにコピーします。

関連情報