Как сопоставить имя строки с именем файла? - PullRequest
0 голосов
/ 26 октября 2018

У меня есть список информации, который выглядит примерно так:

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 голосов
/ 28 октября 2018

Вы можете выполнить обновление времени модификации файла, просто используя awk с его командой system, чтобы вызвать touch -d, чтобы обновить время файла из поля 4 в файле значений, разделенных запятыми.Например:

awk -v FS=', ' '{ system("touch -d "$4 " " $1"/"$2) }' inputfile

Здесь awk читает каждую строку с переменной awk для разделителя полей , установленного как FS=', ' (запятая и пробел).Затем он вызывает команду system, вызывающую touch -d, предоставляя поле 4 в качестве метки времени «дата-время», используемое для обновления файла в каталоге, указанном как $1/$2 (например, 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 (4-е поле)
  • " " (ставит пробел между концом 4-го поля и началом dir / filename)
  • $1 (1-е поле - dirname)
  • "/" (разделитель между dirname/filename)
  • $2 (наконец, имя файла)

( примечание: вы по сути цитируете все, что не является awk предоставленное поле)

Вы можете сделать то же самое с chown и 5-м полем, чтобы обновить владельца файла.

0 голосов
/ 27 октября 2018
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, чтобы выполнить команду.Он проверит, существует ли файл, и если он существует, то к нему будет применена временная метка

Извините, я просто не могу добавить комментарии.Так какое эхо я должен взять и поставить эту команду вместо этого?Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...