如何将字符串名与文件名匹配?

时间:2018-10-26 20:45:13

标签: linux bash shell

我有一个与此相似的信息列表

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

任何答案都将有所帮助!

2 个答案:

答案 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 "和一个空格)
  • $ 4(第4个字段)
  • 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来执行命令。它将检查文件是否存在,如果存在,则将时间戳应用于文件

对不起,我还不能添加评论。那么我必须取哪个回音并放置此命令呢?谢谢