サブディレクトリは維持しながら一致するファイルのみをコピーする方法

サブディレクトリは維持しながら一致するファイルのみをコピーする方法

これを行う方法はありますか?「フォルダ構造を維持しながら、ディレクトリからファイルのサブセットをコピーする方法は?」しかし、rsyncを使用しませんか?

cp、find、およびgrepだけを使用して実行できますか?

私のbashシェルは非常に限られています。つまり、Windowsではgitシェルなので、:()rsyncはオプションではありません。

cygwinを入手できることはわかりますが、この限られた状況で何ができるかを知りたいです。

ベストアンサー1

tarまたはcpio、(どちらか一方を使用できる場合)を使用して特定のファイルをコピーし、pax必要に応じてターゲットディレクトリを作成することもできます。 GNU tarを使用して、名前付きまたは*.txt現在のディレクトリにあるすべての一般ファイルを以下の同じ階層にコピーします。README.*../destination

find . -type f \( -name '*.txt' -o -name 'README.*' \) |
tar -cf - -T - |
tar -xf - -C ../destination

findcpおよびシェルを使用すると、mkdirループを使用して目的のファイルを繰り返し、findシェルコマンドを実行して各ファイルをコピーできます。これは遅くて面倒ですが、移植性に優れています。シェルフラグメントは、の宛先ルートディレクトリ$0とのソースファイルパスを受け取り$1、必要に応じて宛先ディレクトリツリーを作成し(下のコードはディレクトリ権限を保持しない)、ファイルをコピーします。次のコードスニペットは、すべてのPOSIXシステムとほとんどのBusyBoxインストールで動作します。

find . -type f \( -name '*.txt' -o -name 'README.*' \) -exec sh -c '
  mkdir -p "$0/${1%/*}";
  cp -p "$1" "$0/$1"
' ../destination {} \;

通話をグループ化できますsh。もう少し複雑ですが、速いかもしれません。

find . -type f \( -name '*.txt' -o -name 'README.*' \) -exec sh -c '
  for x; do
    mkdir -p "$0/${x%/*}";
    cp -p "$x" "$0/$x";
  done
' ../destination {} +

bashが4以上の場合(Git Bashが十分に新しいかどうかはわかりません)、呼び出す必要はなく、globモードを使用してサブディレクトリに再帰できますfind**

shopt -s globstar extglob
for x in **/@(*.txt|README.*); do
  mkdir -p "../destination/${x%/*}"
  cp -p -- "$x" "../destination/$x"
done

おすすめ記事