我有 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
启用globstar
Bash shell 选项: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
如果您有可能有一些命名不当的文件,其名称中包含换行符或类似名称,您可以使用空分隔符:
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
) 来复制文件。