У меня есть информационный список, похожий на этот
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
Любые ответы были бы полезны!
Я только что нашел, как изменить время модификации файла .. с помощью команды #touch -t. Но я не знаю, как создать скрипт для поиска каталога и файлов внутри ..
Я бы порекомендовал попытаться создать сценарий и поискать на этом сайте похожие вопросы; включение того, что вы пробовали в своем вопросе, имеет большое значение, иначе это может выглядеть как запрос на бесплатные услуги кодирования.
Что вы имеете в виду под «если они такие же»? Просто объедините имя каталога и имя файла и измените время модификации этого файла. Вам не нужно ничего "подбирать".
@Barmar Я думаю, что понял вас, но дело в том, что я не знаю, как сопоставить имена из List.txt, потому что все имена файлов, которые у меня есть в этом списке, уже в Linux, просто нужно изменить время
Тебе не нужно ничего сопоставлять. Просто создайте имя файла, например filename=$dir/$file, затем установите временную метку $filename.
Нет, здесь нет ничего о создании новых файлов. У меня есть файлы после миграции, тысячи файлов, я имею в виду, что теперь они существуют на моей Linux-машине, просто время было установлено неверно после миграции. И я должен вернуть его в прежнее состояние, прежде чем я имею в виду, когда он был изменен еще в 1990 году.
Вы почти у цели, поскольку ваш процессинг управляется list.txt. Просто перейдите в каталог, в котором есть файлы, и запустите процесс. Он найдет каждый файл по мере обработки списка и затем выдаст команду touch. (Или я бы так сделал). Если у вас несколько каталогов, вам придется управлять этим, но вы можете запустить один и тот же сценарий в нескольких каталогах, и команда touch завершится ошибкой, когда файла нет, но она будет работать, когда правильный файл есть. Удачи.





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, чтобы выполнить команду. Он проверит, существует ли файл, и если да, то применит к нему отметку времени.
Извините, я пока не могу добавлять комментарии. Итак, какое эхо я должен взять и поставить вместо этого эту команду? Спасибо
Хотя это может сработать (я не проверял), это довольно неэффективно, порождая более дюжины процессов на строку ввода, включая cut (вызывается 8 раз за итерацию), sed (вызывается 2 раза за итерацию) и tr (и не забывайте о каналах, связывающих stdout первого процесса с stdin следующего). Кроме того, "cat | ..." - ненужное использование cat. Вы можете просто заполнить цикл while read z; do ... done < List.txt, используя перенаправление по прямому назначению.
Большое спасибо, а что, если у каталогов разные имена? Потому что ваш меняется только тогда, когда имена каталогов совпадают и имена файлов тоже
Вы можете справиться с обновлением времени модификации файла, просто используя 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-го поля и началом каталога / имени файла)$1 (1-е поле - dirname)"/" (разделитель между dirname/filename)$2 (наконец, имя файла)(Заметка: вы, по сути, цитируете все, что не является полем, предоставленным awk)
Вы можете сделать то же самое с chown и 5-м полем, чтобы обновить право собственности на файл.
Эта команда отлично работает, но она изменяет время только в тех файлах, которые имеют одинаковое имя каталога .. А если они разные? Спасибо
@asel информация о каталоге предоставляется первым полем вашего файла данных в каждой строке, например "dir1, filename1, ...". Эта процедура (или любая другая процедура в этом отношении) может изменять метку времени только для тех файлов, которые указаны в вашем файле List.txt. Теперь есть способы изменить время модификации других файлов на некоторую предопределенную дату / время, но у вас должен быть этот "date/time". Обычно, если вы хотите изменить все другие файлы на некоторую дату / время, вы можете использовать команду find в сочетании с -newermt date time или что-то подобное.
Re: «Итак, для этого я должен создать сценарий» ... где сценарий, или что вы пробовали?