単一のファイルをツリー構造の最も深いサブディレクトリのすべてにコピーしようとしています。次のように想像してみてください。
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
-links
exec
find . -exec echo X{}X \; -type d -links 2 -exec echo Y{}Y \;
2つのファイルの間にすべてのファイルが一覧表示されますが、2つのファイルの間に正しいファイルのみがリストさX
れていることがわかります。これは中間ディレクトリにも表示される理由を説明します。dir{3,5,7}
Y
bar
また、この-r
オプションは再帰コピーを有効にします。コピーされる内容は通常のファイル(bar
)なので、-r
必要ありません。
答え2
あなたはそれを使用することができます:
find . -type d -links 2 -exec cp file {} \;
2つのハードリンクがあるディレクトリを見つけて、ファイルをその特定のディレクトリにコピーします。