如何在相同的目录结构之间复制具有相同扩展名的所有文件?

如何在相同的目录结构之间复制具有相同扩展名的所有文件?

我有 2 个独立的文件夹 A 和 B。B 有许多扩展名为.build. A 中有一个 fe 子目录,其结构与 B 的子目录相同。

例如 A 有some_path/Tools/Camera/且 B 有different_path/Tools/Camera。假设我手动识别了 2 个具有相同结构的子目录,一个在 A,一个在 B,我需要将所有 .build 文件从 B 的子目录复制到 A 的子目录中。

我该怎么做?

答案1

启用globstarBash shell 选项: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

如果您有可能有一些命名不当的文件,其名称中包含换行符或类似名称,您可以使用空分隔符:

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'

其中zmv使用我们的mkdcp函数而不是cp(with -C) 来复制文件。

相关内容