パスに基づいて複数のファイルを複数の場所にコピーする方法は?

パスに基づいて複数のファイルを複数の場所にコピーする方法は?

macOSでは、私のフォルダ構造は次のようになります

├── src
    └── components
        └── componentA
            └── README.md
        └── componentB
            └── README.md
└── destination
    └── components
        ├── componentA
        └── componentB

README.md単一のコマンドですべてをソースベースのマッピングsrcにコピーする方法が何であるかを知りたいです。destination

ベストアンサー1

次のループを使用してくださいbash

shopt -s nullglob dotglob globstar

for srcfile in src/**/README.md; do
    destfile=destination/${srcfile#src/}
    mkdir -p "${destfile%/*}" &&
    cp "$srcfile" "$destfile"
done

ここでは**、glob(globstarシェルオプションを設定して有効)を使用してディレクトリ内のすべてのファイルをbash繰り返します。README.mdsrc

各ファイルのターゲットパス名は、src/初期文字列を 。destination/次に、ターゲットディレクトリを作成してファイルをコピーします。

シェルnullglobオプションは、パターンがどの名前とも一致しない場合、ループがまったく実行されないことを保証し、thodotglobオプションは隠された名前の一致を有効にします。

すべてのファイルをコピーしますか*.md?パターンで*.md代わりに使用してください。README.md


すべてのシェルを使用して、プロセス全体を単一のコマンドで実行できます。

bash -O globstar -O nullglob -O dotglob -c 'for s in src/**/README.md; do d=destination/${s#src/}; mkdir -p "${d%/*}" && cp "$s" "$d"; done'

、を使用して見つかったファイルが通常のファイルであることをfind確認するために追加のチェックを実行します。README.md

find src -type f -name README.md -exec sh -c '
    for srcfile do
        destfile=destination/${srcfile#src/}
        mkdir -p "${destfile%/*}" &&
        cp "$srcfile" "$destfile"
    done' sh {} +

sh -cインラインスクリプトのループ本体が次のようになることは驚くべきことではありません。まったく同じbashトップレベルスクリプトのループに。

おすすめ記事