例如我有一个文件夹:
F1\F11\some files...
F1\F12\some files...
F1\F12\F121\some files..
我还有另一个结构
F2\F21\some files...
F2\F22\some files...
F2\F22\folder\some files...
文件夹名称F11
- F21
,F12
和F22
相等。
文件夹中 的F21
文件数比 中的F22
少F11
。F12
我需要递归F2
复制F1
,但将被替换的文件应该保存在备份文件夹中:
Fbackup\F11\those files..
Fbackup\F12\those files..
这是为了能够对该副本执行“撤消”操作所必需的。例如,我已递归复制F2
,F1
然后将 Fbackup 复制到,F1
并且我拥有原始的F1
。
答案1
如果您愿意使用 Unix shell,下面有几个使用bash
我自己的 C shell 的替代方法。
C shell 解决方案
cd F2
foreach i (...\*)
if ( -f $i ) then
if ( -e F1\$i ) cp F1\$i Fbackup\$i
cp $i F1\$i
end
end
该...
符号是不定目录通配符匹配零个或多个目录级别,无论需要什么才能使其余模式匹配。 ...\*
匹配目录树中的每个文件或目录F2
。-e
操作员测试是否存在以及-f
操作员测试文件。
此代码片段假设不存在需要关注的隐藏文件或目录。它还假设 中的每个目录F2
(即使不是每个文件)都已存在于F1
和 中Fbackup
。
如果需要考虑隐藏文件和丢失的目录,解决方案是设置
nonohidden = 1
和mkdir
任何缺失的目录:
cd F2
@ nonohidden = 1
foreach i (...\*)
if ( -f $i ) then
if ( -e F1\$i ) then
if ( ! -e Fbackup\$i:h ) mkdir -r Fbackup\$i:h
cp F1\$i Fbackup\$i
end
if ( ! -e F1\$i:h ) mkdir -r F1\$i:h
cp $i F1\$i
end
end
bash
解决方案
如果你更喜欢赛格威 bash
,您需要使用find
代替...
通配符来遍历F2
目录。该解决方案可能如下所示。(我不是bash
专家,因此可能可以改进这一点。)
首先,创建一个脚本,并将其命名为backupscript.sh
:
#!/usr/bin/bash
if [ -f "$@" ]; then
if [ -e F1/"$@" ]; then
cp F1/"$@" Fbackup/"$@"
fi
head=$(dirname "$@")
if [ ! -e F1/"$head" ]; then
mkdir -p F1/"$head"
fi
cp "$@" F1/"$@"
end
然后运行如下:
cd F2
find . -type f | xargs -I "{}" bash -c "backupscript.sh {}"