
次のコマンドを使用してファイルを見つけて別の場所にコピーします。
find /search/ -name file.txt -exec cp -Rp {} /destination \;
親ディレクトリのすべてのファイルとサブディレクトリをコピーする方法はfile.txt
?
はい、
/search/test/sub
/search/test/sub2
/search/test/file.txt
/search/test/file.doc
次のようにコピーする必要があります。
/destination/sub
/destination/sub2
/destination/file.txt
/destination/file.doc
答え1
(標準述語ではなく、頻繁に実装されている)を使用すると、その-execdir
ユーティリティはファイルがあるディレクトリで実行されます。
これはあなたができることを意味します
find /search -name file.txt -execdir cp -Rp . /destination \;
いいえ-execdir
:
find /search -name file.txt -exec sh -c 'cp -Rp "${1%/*}/." /destination' sh {} \;
または、
find /search -name file.txt -exec sh -c 'cd "${1%/*}" && cp -Rp . /destination' sh {} \;
最後の2つの亜種は、見つかった各ファイルに対して短いインラインスクリプトを実行します。スクリプトはファイルのパス名を最初の引数(in)として使用し(標準引数の置き換え)を使用して、パス名$1
からファイル名を削除します。次に、最初のバリエーションと同じコマンドを${1%/*}
適用します。cp
-execdir
これを実行するコードは、最上位のバリエーションが実際に行うことをよりcd
忠実にエミュレートします-execdir
が、中間バリアントはパスの.
末尾にあるソースディレクトリを参照してディレクトリ変更をバイパスします。