在特殊情况下,我们希望修改一个Word文档的创建时间和修改时间,比如说证明文件没有被篡改。(真是高科技作弊=_=)
在文件属性中,有记录创建时间和修改时间。经过复制等操作时,创建时间会发生变化,所以更改这个时间没有任何意义。而修改时间是在文件真正被编辑时才发生改变。修改时间作为文件属性记录在文件系统中,通过touch命令的方式可以直接修改。
下面以docx文件为例,
- 将docx文件的后缀名改为zip,并解压zip文件。
- 打开docProps文件夹,打开core.xml文件。
- 可以看到,dcterms:created对应的值是创建时间,dcterms:modified对应的值是修改时间,时间的格式是yyyy-MM-ddTHH:mm:ssZ。
- 修改完成后,保持原有的文件夹结构,压缩成zip文件,修改后缀名为docx,完成!
以下是一个脚本,输入一个文件夹,会修改文件夹下所有docx文件的创建时间和修改时间为2016年6月的某个日期。
#/bin/sh year="2016" month="06" # 输入文件夹目录 echo "请输入目录(路径中不要有空格): " read dir # 检测文件夹下是否有doc文件 cd $dir for file in `ls` do if test -d ${dir}"/"${file} then continue fi extension=${file##*.} if [ "$extension" == "doc" ] then echo "检测到doc文件,请先转换成docx" exit -1 fi done cd $dir mkdir origin for file in `ls` do # 跳过输入文件夹中的文件夹 if test -d ${dir}"/"${file} then continue fi # 获取文件后缀 extension=${file##*.} if [ "$extension" == "docx" ] then echo "处理文件:"${file}"..." # 获取不含后缀的文件名称 filename=${file%%.*} # 解压docx文件 cd ${dir} mkdir ${filename} unzip ${file} -d ${dir}"/"${filename} > /dev/null mv ${file} ./origin/ # 获取旧时间 coreXml=`cat ${dir}/${filename}/docProps/core.xml` docCreateTime=$(expr "'${coreXml}'" : '.*(.*).*') docModifyTime=$(expr "'${coreXml}'" : '.*(.*).*') # 生成新时间 ((day=$RANDOM % 28 + 1)) ((dayafter=$day + 1)) if (( $day < 10 )); then day="0"${day} fi if (( $dayafter < 10 )); then dayafter="0"${dayafter} fi ((hour=$RANDOM % 16 + 7)) if (( $hour < 10 )); then hour="0"${hour} fi ((hourafter=$RANDOM % 16 + 7)) if (( $hourafter < 10 )); then hourafter="0"${hourafter} fi ((miniute=$RANDOM % 60)) if (( $miniute < 10 )); then miniute="0"${miniute} fi ((miniuteafter=$RANDOM % 60)) if (( $miniuteafter < 10 )); then miniuteafter="0"${miniuteafter} fi ((second=$RANDOM % 60)) if (( $second < 10 )); then second="0"${second} fi ((secondeafter=$RANDOM % 60)) if (( $secondeafter < 10 )); then secondeafter="0"${secondeafter} fi docCreateTimeNew=${year}"-"${month}"-"${day}"T"${hour}":"${miniute}":"${second}"Z" docModifyTimeNew=${year}"-"${month}"-"${dayafter}"T"${hourafter}":"${miniuteafter}":"${secondeafter}"Z" echo ${docCreateTime}" -> "${docCreateTimeNew} echo ${docModifyTime}" -> "${docModifyTimeNew} # 写入新时间 cat ${dir}/${filename}/docProps/core.xml | sed "s/${docCreateTime}/${docCreateTimeNew}/g" | sed "s/${docModifyTime}/${docModifyTimeNew}/g" > ${dir}/${filename}/docProps/core2.xml rm -f ${dir}/${filename}/docProps/core.xml mv ${dir}/${filename}/docProps/core2.xml ${dir}/${filename}/docProps/core.xml # 还原docx文件 cd ${dir}"/"${filename} zip -r ${dir}"/"${file} ./* > /dev/null rm -rf ${dir}"/"${filename} # 用touch修改文件系统中记录的修改时间 touch -t ${year}${month}${dayafter}${hourafter}${miniuteafter}"."${secondeafter} ${dir}"/"${file} fi done