同じサブディレクトリパスを使用して複数のディレクトリにファイルをコピーする方法は?

同じサブディレクトリパスを使用して複数のディレクトリにファイルをコピーする方法は?

私はgit commit Hookを書いて、というリポジトリでテストしましたmyrepo。それでは、~/reposフォルダ内のすべてのリポジトリにコピーしたいと思います。そのために、私は以下を試しました。

$ cd ~/repos/myrepo/.git/hooks
$ cp prepare-commit-msg ~/repos/*/.git/hooks

これを実行すると、cp各ディレクトリに次のメッセージが表示されますrepos

cp: -r not specified; omitting directory <directory-name>

prepare-commit-msg私はこれがディレクトリではないと100%確信しています。なぜcp私はそれを使用しなかったと文句を言うのですか-r

ベストアンサー1

findそれはあなたが探しているツールかもしれません。これを使用して指定され、フォルダhooksの下にあるすべてのディレクトリを見つけることができます~/repos/。見つかったディレクトリごとにfindファイルをコピーするように指示します。

myrepoこれにより、リポジトリがファイルを自分自身にコピーしようとするとエラーメッセージが表示されますが、エラーは無視できます。

cd ~/repos/myrepo/.git/hooks
find ~/repos/ -type d -name hooks -exec cp -vp prepare-commit-msg {} \;

このコマンドは、ディレクトリまたはファイル名に奇妙な文字がある場合を処理するように改善することができますが、これは重要です。

cpのコマンドが機能しない理由についてよりよく説明する質問があるかもしれませんが、これはシェルがコマンドを次のように拡張するためです。

cp prepare-commit-msg ~/repos/repo_A/.git/hooks ~/repos/repo_B/.git/hooks ~/repos/repo_C/.git/hooks ~/repos/repo_D/.git/hooks ~/repos/repo_E/.git/hooks

その構文が与えられたら、cpファイルprepare-commit-msgと4つのディレクトリをコピーし、コピーされたすべての~/repos/repo_A/.git/hooksファイル~/repos/repo_D/.git/hooks/ディレクトリを~/repos/repo_E/.git/hooks。 t ディレクトリを再帰的にコピーします。cp-r

元の構文に似たソリューションを構築するには、次のものを使用できます。

cd ~/repos/myrepo/.git/hooks
dirs=( ~/repos/*/.git/hooks )
for d in "${dirs[@]}"
do
    cp -vp prepare-commit-msg "$d/"
done

ls解析された出力を含める方法はお勧めできません。

おすすめ記事