为了防止这个问题被关闭,我把问题缩小到了bash脚本。
编辑问题
我运行了一个小型网络,在备份程序中犯了一个错误。我每天都在运行rsync
,它的设置方式是,如果在源上重命名文件夹,则可能会在备份设备上发生潜在的重复。
rsync -varz --no-perms --exclude-from=/path/to/exclude_file --log-file=/path/to/rsync_logs
最近,一位用户做了不少更改,结果导致了大量重复。
我可以使用什么样的bash脚本策略来攻击它?我已经尝试过递归地列出并输出到文件,并使用diff
来比较这些文件。这使我看到了重复问题的影响。如果我可以使用某种自动过程来删除重复项,那将为我节省大量时间。
我开始尝试这样的东西:
find /mnt/data/ -maxdepth 2 -mindepth 1 -type d -printf '%fn' > data.txt
并与进行比较
find /mnt/backup/ -maxdepth 2 -mindepth 1 -type d -printf '%fn' > backup.txt
我的问题的一个例子是:
drwxr-xr-x 0 bob staff 0 Jun 25 2009 7-1-08
drwxr-xr-x 0 bob staff 0 Jun 25 2009 2008-07-01
这是备份驱动器中的一个示例,两个目录的内容完全相同。备份包含两者,而源只有一个:
drwxr-xr-x 0 bob staff 0 Jun 25 2009 2008-07-01
这种问题在整个备份驱动器中都存在。
编辑
我创建了两个列表,diff
对它们进行了编辑,然后手动完成并协调了更改。一旦我进入其中,并没有我最初想象的那么糟糕。我在这里对两个答案(@Mark Pettit和@ebarrere)都给出了+1,因为我最终确实使用了每个答案中的片段。在这个实验过程中,我运行了几个find命令,最后我也修改了rsync
脚本,更具体地说。谢谢大家。
您应该通过修复rsync脚本来解决这个问题,而不是通过编写新的bash脚本。
如果您的源是干净的,并且只是备份目标出错,那么您可以通过在"rsync"的参数列表中添加"--delete"来轻松地清理目标。该标志告诉rsync删除目标上源上不存在的任何目录。
尽管我同意@Mark关于修复rsync
脚本的建议,但您可以使用find
和exec
来查找重复文件。类似这样的东西:
cd /mnt/data
find . -type f -exec bash -c "ls /mnt/backup/'{}' &> /dev/null && echo /mnt/backup/'{}'" ;
将回显两个目录下同一路径中存在的任何文件。打印的路径将指向备份目录中的文件。您可以将echo
更改为rm -f
来删除这些文件,但要小心。