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
globstar
Bashシェルオプションを有効にします。shopt -s globstar
次に、ディレクトリをBに変更し、次を実行します。
for path in **/; do
[ -d "<A-dir>/$path" ] && cp -n "$path/"*.build "<A-dir>/$path"
done
次に、Bの各サブディレクトリを再帰的にチェックし、Aに同等のサブディレクトリがあることを確認します。存在する場合、.build
Bサブディレクトリ内のすべてのファイルが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
使用します。mkdcp
cp
-C