Как сопоставить имя строки с именем файла?

У меня есть информационный список, похожий на этот

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

Любые ответы были бы полезны!

Re: «Итак, для этого я должен создать сценарий» ... где сценарий, или что вы пробовали?

l'L'l 26.10.2018 22:48

Я только что нашел, как изменить время модификации файла .. с помощью команды #touch -t. Но я не знаю, как создать скрипт для поиска каталога и файлов внутри ..

flow 26.10.2018 22:51

Я бы порекомендовал попытаться создать сценарий и поискать на этом сайте похожие вопросы; включение того, что вы пробовали в своем вопросе, имеет большое значение, иначе это может выглядеть как запрос на бесплатные услуги кодирования.

l'L'l 26.10.2018 23:00

Что вы имеете в виду под «если они такие же»? Просто объедините имя каталога и имя файла и измените время модификации этого файла. Вам не нужно ничего "подбирать".

Barmar 26.10.2018 23:03

@Barmar Я думаю, что понял вас, но дело в том, что я не знаю, как сопоставить имена из List.txt, потому что все имена файлов, которые у меня есть в этом списке, уже в Linux, просто нужно изменить время

flow 26.10.2018 23:14

Тебе не нужно ничего сопоставлять. Просто создайте имя файла, например filename=$dir/$file, затем установите временную метку $filename.

Barmar 26.10.2018 23:15

Нет, здесь нет ничего о создании новых файлов. У меня есть файлы после миграции, тысячи файлов, я имею в виду, что теперь они существуют на моей Linux-машине, просто время было установлено неверно после миграции. И я должен вернуть его в прежнее состояние, прежде чем я имею в виду, когда он был изменен еще в 1990 году.

flow 26.10.2018 23:19

Вы почти у цели, поскольку ваш процессинг управляется list.txt. Просто перейдите в каталог, в котором есть файлы, и запустите процесс. Он найдет каждый файл по мере обработки списка и затем выдаст команду touch. (Или я бы так сделал). Если у вас несколько каталогов, вам придется управлять этим, но вы можете запустить один и тот же сценарий в нескольких каталогах, и команда touch завершится ошибкой, когда файла нет, но она будет работать, когда правильный файл есть. Удачи.

shellter 27.10.2018 01:40
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
8
100
2

Ответы 2

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, используя перенаправление по прямому назначению.

David C. Rankin 28.10.2018 04:11

Большое спасибо, а что, если у каталогов разные имена? Потому что ваш меняется только тогда, когда имена каталогов совпадают и имена файлов тоже

flow 29.10.2018 18:16

Вы можете справиться с обновлением времени модификации файла, просто используя 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-го поля и началом каталога / имени файла)
  • $1 (1-е поле - dirname)
  • "/" (разделитель между dirname/filename)
  • $2 (наконец, имя файла)

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

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

Эта команда отлично работает, но она изменяет время только в тех файлах, которые имеют одинаковое имя каталога .. А если они разные? Спасибо

flow 29.10.2018 18:10

@asel информация о каталоге предоставляется первым полем вашего файла данных в каждой строке, например "dir1, filename1, ...". Эта процедура (или любая другая процедура в этом отношении) может изменять метку времени только для тех файлов, которые указаны в вашем файле List.txt. Теперь есть способы изменить время модификации других файлов на некоторую предопределенную дату / время, но у вас должен быть этот "date/time". Обычно, если вы хотите изменить все другие файлы на некоторую дату / время, вы можете использовать команду find в сочетании с -newermt date time или что-то подобное.

David C. Rankin 30.10.2018 05:33

Другие вопросы по теме