パターンと一致するディレクトリに入れ子になったファイルをコピーする方法は?

パターンと一致するディレクトリに入れ子になったファイルをコピーする方法は?

このパターンに一致するサブディレクトリからファイルをコピーしようとしています。

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すでに存在していると仮定しています。私はまた、あなたが隠された名前を持つサブディレクトリやファイルに興味がないと仮定します。

関連情報