同じディレクトリ構造間で同じ拡張子を持つすべてのファイルをコピーする方法は?

同じディレクトリ構造間で同じ拡張子を持つすべてのファイルをコピーする方法は?

A、Bフォルダが2つあります。 Bには多くの拡張子があります.build。 A には、B のサブディレクトリと同じ構造を持つ fe サブディレクトリがあります。

たとえば、Aにはあり、some_path/Tools/Camera/Bにはがありますdifferent_path/Tools/Camera。同じ構造を持つ2つのサブディレクトリ(1つはAに、もう1つはBにあります)を手動で識別し、BのサブディレクトリからAのサブディレクトリにすべての.buildファイルをコピーする必要があるとします。

どうすればいいですか?

答え1

globstarBashシェルオプションを有効にします。shopt -s globstar

次に、ディレクトリをBに変更し、次を実行します。

for path in **/; do
    [ -d "<A-dir>/$path" ] && cp -n "$path/"*.build "<A-dir>/$path"
done

次に、Bの各サブディレクトリを再帰的にチェックし、Aに同等のサブディレクトリがあることを確認します。存在する場合、.buildBサブディレクトリ内のすべてのファイルがAにコピーされます。

答え2

これを行う方法はいくつかあります。

私は一つを考えた。

cd different_path
find . -iname '*.build' | while read filename ; do 
    cp -n "$filename" "some_path/${filename#./}" 
done

名前に改行または類似の名前を含む不適切に名前付きファイルがある可能性がある場合は、NULL区切り文字を使用できます。

cd different_path
find . -iname '*.build' -print0 | while IFS= read -r -d $'\0' filename ; do 
    cp -n "$filename" "some_path/${filename#./}" 
done

答え3

そしてzsh

autoload -Uz zmv # best in ~/.zshrc
zmv -C 'A/(**/)(*.build)' 'B/$1$2'

そのサブディレクトリが存在することを保証できない場合は、B次のように変更できます。

mkdcp() { mkdir -p -- $2:h && cp -- "$@"; }
zmv -P mkdcp 'A/(**/)(*.build)' 'B/$1$2'

ファイルをコピーするには(with)の代わりに関数をzmv使用します。mkdcpcp-C

関連情報