批处理文件复制文件,将原始文件保留在其他文件夹中

批处理文件复制文件,将原始文件保留在其他文件夹中

例如我有一个文件夹:

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- F21F12F22相等。

文件夹中 的F21文件数比 中的F22F11F12

我需要递归F2复制F1,但将被替换的文件应该保存在备份文件夹中:

Fbackup\F11\those files..
Fbackup\F12\those files..

这是为了能够对该副本执行“撤消”操作所必需的。例如,我已递归复制F2F1然后将 Fbackup 复制到,F1并且我拥有原始的F1

答案1

如果您愿意使用 Unix shell,下面有几个使用bash我自己的 C shell 的替代方法。

C shell 解决方案

你可以这样做汉密尔顿C壳, 包括免费版本

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 = 1mkdir任何缺失的目录:

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 {}"

相关内容