我有一个与此相似的信息列表
List.txt
dir1, filename1, 1990/01/01, 1995/01/09 10:35, john
dir2, filename2, 1994/12/08, 1994/12/10 05:43, jenny
dir3, filename3, 2000/07/03, 2005/10/11 14:56, Henrik
第一个是目录,文件名,创建时间,修改时间,文件所有者。
此列表很长。在从大型机迁移到Linux的过程中,所有目录和文件均已安全迁移,并且其中的内容相同。但是问题是修改时间更改为迁移时的时间,因此所有文件都具有修改时间为2018年。
因此,我的任务是恢复迁移之前文件的修改时间。因此,为此,我必须创建一个脚本,该脚本将查看List.txt,并将其中的目录名和文件名与Linux上的文件进行匹配,如果它们相同,则必须将修改时间更改为旧的。
这个脚本我试图将newing.txt文件的修改时间更改为List.txt,并且它起作用了。
#!/bin/bash
aa=$1
while IFS="," read c1 c2 c3 c4 c5
do
for n in $(pwd)
do
echo "$c1 $c2 $c3 $c4 $c5"
y=$(echo $c4 | awk '{print $2}')
b=$(echo $y | tr -d ':')
echo $b
c=$(echo $c4 | awk '{print $1}')
againcommand=$(echo $c | tr -d '/')
echo "$againcommand"
abc=$againcommand$b
echo $abc
bde=`touch -t $abc "newing.txt"`
echo $bde
done
done < $aa
任何答案都将有所帮助!
答案 0 :(得分:1)
您可以简单地使用awk
及其system
命令来调用touch -d
来处理逗号中的字段4
来更新文件修改时间。分隔值文件。例如:
awk -v FS=', ' '{ system("touch -d "$4 " " $1"/"$2) }' inputfile
此处awk
读取带有awk
变量的每一行,该变量将字段分隔符设置为FS=', '
(逗号和空格)。然后,它调用system
命令,调用touch -d
,提供字段4
作为“日期时间”时间戳,用于更新指定为$1/$2
的目录中的文件(例如{{ 1}})。
使用输入文件为dir1/filename1
相当于调用:
inputfile
提供touch -d 1995/01/09 10:35 dir1/filename1
touch -d 1994/12/10 05:43 dir2/filename2
touch -d 2005/10/11 14:56 dir3/filename3
命令中的引号以引用该命令的非字段部分。对于system(...)
,然后使用以下命令构建命令:
"touch -d "$4 " " $1"/"$2
(例如"touch -d "
和一个空格)touch -d
(在第4个字段的末尾和dir / filename的开头之间放置一个空格)" "
(第一个字段-目录名)$1
("/"
之间的分隔符)dirname/filename
(最后是文件名)(注意:,您实际上是引用了不是$2
提供的字段的所有内容)
您可以使用awk
和第5个字段执行相同的操作,以更新文件所有权。
答案 1 :(得分:0)
cat List.txt |while read z;do if [ -f $(echo $z|cut -d, -f1)/$(echo $z|cut -d, -f2|sed "s/^\s\+//g") ];then echo touch -t $(echo $z|cut -d, -f4|cut -d ' ' -f2|tr -d '/')$(echo $z|cut -d, -f4|cut -d ' ' -f3|tr -d ':') $(echo $z|cut -d, -f1)/$(echo $z|cut -d, -f2|sed "s/^\s\+//g") ;fi;done
您可以删除echo
来执行命令。它将检查文件是否存在,如果存在,则将时间戳应用于文件
对不起,我还不能添加评论。那么我必须取哪个回音并放置此命令呢?谢谢