我的问题是关于如何通过保留所有旧版本的文件将许多目录中的许多文件保存在一个目录中。我有大约 10 个包含非常相似文件的目录(使用 Linux、Windows 和 MacOS 创建的 10 个备份目录)。我想将这 10 个目录合并到一个目录中。例如,我有 3 个目录 a、b 和 c,内容如下:
A
- fileA.txt(日期 2012 年 10 月 10 日)
- fileB.txt(日期 2012 年 10 月 12 日)
- fileC.txt(日期 2013 年 1 月 5 日)
b
- fileA.txt(日期 2013 年 10 月 1 日)
- fileB.txt(日期 2013 年 10 月 2 日)
- fileC.txt(日期 2013 年 1 月 5 日)
- fileD.txt(日期 2013 年 2 月 5 日)
C
- fileA.txt(日期 2012 年 10 月 10 日)
- fileB.txt(日期 2013 年 12 月 2 日)
生成的目录必须是:
- fileA.txt (日期 2013 年 10 月 1 日 来自 b)
- fileA.txt_20121010hhmmss(来自 a 和 c(同一个文件))
- fileB.txt (日期 2013 年 12 月 2 日 来自 c)
- fileB.txt_20121210hhmmss(来自 a)
- fileB.txt_20130210hhmmss(来自 b)
- fileC.txt(日期 2013 年 5 月 1 日,来自 a 和 b(同一文件))
- fileD.txt(日期 2013 年 5 月 2 日 来自 b)
hh=小时 mm=分钟 ss=秒
目前我正在编写一个 Perl 脚本,它可以使用函数“比较”和 md5 校验和来比较文件。
我为了找到修改日期(如果文件不同),我正在使用元数据(当我可以时)使用 Exiftool(一些兼容文件,如 docx、ppt pdf jpg……)否则我正在使用 stat 命令的时间戳。
未添加扩展名的文件必须是所有同名文件中较新的文件。
Perl 脚本非常慢且复杂,因此我正在寻找更为强大的解决方案。
感谢您的帮助。
注意: - 我想在 Synology 服务器 (DS212) 上使用此解决方案,而在该服务器上我只有很少的经典 shell 命令。如有必要,我可以将这些文件复制到 Linux(或 OSX)机器上来执行此操作。
答案1
解决方案:
cat backup.sh
#!/bin/sh
for i in `find ./{a,b,c} -type f`
do
FILE=`basename $i`
FTIME=`stat -c %x $i | awk -F"." '{print $1}' | sed 's/[-: ]//g'`
NEWNAME=${FILE}_${FTIME}
echo "cp $i result/${NEWNAME}"
cp -p $i result/${NEWNAME}
done
cd result
for i in `ls -1 | awk -F"_" '{print $1}' | sort -u`
do
TNAME=`ls -1t ${i}* | head -1`
echo "mv ${TNAME} ${i}"
mv ${TNAME} ${i}
done
“结果”目录中的备份文件。
工作原理(示例):
$ ls -l {a,b,c,result}
a:
total 0
-rw-r--r-- 1 test test 0 Jun 6 16:28 fileA.txt
-rw-r--r-- 1 test test 0 Jun 6 16:28 fileB.txt
-rw-r--r-- 1 test test 0 Jun 6 16:28 fileC.txt
b:
total 0
-rw-r--r-- 1 test test 0 Jun 6 16:28 fileA.txt
-rw-r--r-- 1 test test 0 Jun 6 16:29 fileB.txt
-rw-r--r-- 1 test test 0 Jun 6 16:29 fileC.txt
-rw-r--r-- 1 test test 0 Jun 6 16:29 fileD.txt
c:
total 0
-rw-r--r-- 1 test test 0 Jun 6 16:29 fileA.txt
-rw-r--r-- 1 test test 0 Jun 6 16:29 fileB.txt
result:
total 0
~/tmp/backup $ ./backup.sh
cp ./a/fileA.txt result/fileA.txt_20130606162832
cp ./a/fileB.txt result/fileB.txt_20130606162836
cp ./a/fileC.txt result/fileC.txt_20130606162846
cp ./b/fileA.txt result/fileA.txt_20130606162857
cp ./b/fileD.txt result/fileD.txt_20130606162910
cp ./b/fileB.txt result/fileB.txt_20130606162900
cp ./b/fileC.txt result/fileC.txt_20130606162906
cp ./c/fileA.txt result/fileA.txt_20130606162920
cp ./c/fileB.txt result/fileB.txt_20130606162923
mv fileA.txt_20130606162920 fileA.txt
mv fileB.txt_20130606162923 fileB.txt
mv fileC.txt_20130606162906 fileC.txt
mv fileD.txt_20130606162910 fileD.txt
~/tmp/backup $ ls -l {a,b,c,result}
a:
total 0
-rw-r--r-- 1 test test 0 Jun 6 16:28 fileA.txt
-rw-r--r-- 1 test test 0 Jun 6 16:28 fileB.txt
-rw-r--r-- 1 test test 0 Jun 6 16:28 fileC.txt
b:
total 0
-rw-r--r-- 1 test test 0 Jun 6 16:28 fileA.txt
-rw-r--r-- 1 test test 0 Jun 6 16:29 fileB.txt
-rw-r--r-- 1 test test 0 Jun 6 16:29 fileC.txt
-rw-r--r-- 1 test test 0 Jun 6 16:29 fileD.txt
c:
total 0
-rw-r--r-- 1 test test 0 Jun 6 16:29 fileA.txt
-rw-r--r-- 1 test test 0 Jun 6 16:29 fileB.txt
result:
total 0
-rw-r--r-- 1 test test 0 Jun 6 16:29 fileA.txt
-rw-r--r-- 1 test test 0 Jun 6 16:28 fileA.txt_20130606162832
-rw-r--r-- 1 test test 0 Jun 6 16:28 fileA.txt_20130606162857
-rw-r--r-- 1 test test 0 Jun 6 16:29 fileB.txt
-rw-r--r-- 1 test test 0 Jun 6 16:28 fileB.txt_20130606162836
-rw-r--r-- 1 test test 0 Jun 6 16:29 fileB.txt_20130606162900
-rw-r--r-- 1 test test 0 Jun 6 16:29 fileC.txt
-rw-r--r-- 1 test test 0 Jun 6 16:28 fileC.txt_20130606162846
-rw-r--r-- 1 test test 0 Jun 6 16:29 fileD.txt
~/tmp/backup $