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.md
src
各ファイルのターゲットパス名は、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
トップレベルスクリプトのループに。