このパターンに一致するサブディレクトリからファイルをコピーしようとしています。
vendor/plugin/*/tasks/*.rake
フォルダに入れて
lib/tasks
答え1
簡単に聞こえます:
cp vendor/plugin/*/tasks/*.rake lib/tasks
または、最初の項目が*
サブツリー全体と一致する必要がある場合は、次の方法を使用してください。
find vendor/plugin -path "*/tasks/*.rake" -exec cp "{}" lib/tasks +
答え2
ファイルを上書きするのではなく、名前の競合に関する通知を受け取り、名前の競合(およびvendor/plugin/a/tasks/1.rake
間の競合など)を処理する場合は、シェルループを使用します。vendor/plugin/b/tasks/1.rake
destdir=lib/tasks
for pathname in vendor/plugin/*/tasks/*.rake
do
destpath=$destdir/${pathname##*/}
if [ -e "$destpath" ]; then
printf 'Can not move "%s", "%s" is in the way' \
"$pathname" "$destpath" >&2
continue
fi
cp "$pathname" "$destpath"
done
ライン
destpath=$destdir/${pathname##*/}
次のように書くこともできます。
destpath=$destdir/$(basename "$pathname")
ターゲットのパス名を設定して、すでに使用されていることを確認してください。
また、これを行うことができます
cp -i vendor/plugin/*/tasks/*.rake lib/tasks
ユーティリティ自体から各名前の競合の対話型プロンプトを取得しますcp
。このコマンドはvendor/plugin/*/tasks/*.rake
コマンドラインのパターン拡張に依存し、拡張パス名の数によっては「引数リストが長すぎます」というエラーが発生する可能性があります。この場合、ループを代わりに使用できます。
for pathname in vendor/plugin/*/tasks/*.rake
do
cp -i "$pathname" lib/tasks
done
このループは、この回答の初期ループとほぼ同じです。唯一の違いは、cp
名前の競合が発生したときにユーティリティがユーザーにメッセージを表示することです。
上記のすべてのバリエーションは、パターンがvendor/plugin/*/tasks/*.rake
実際に何かと一致し、ターゲットディレクトリがlib/tasks
すでに存在していると仮定しています。私はまた、あなたが隠された名前を持つサブディレクトリやファイルに興味がないと仮定します。