изменить дату последнего изменения для многих файлов, используя ссылки

Команда оболочки readможет считывать несколько переменных. Вам нужно установить переменную IFSкак вкладку, что в bash вы делаете с помощью ANSI -C Quoting:IFS=$'\t'

Для вывода вам нужна встроенная команда printf.

while IFS=$'\t' read -r old new; do 
    printf '%s\t%s\n' "$old" "$new"
done < update_ids.txt

Чтобы сохранить данные, разделенные вкладкой -, в переменную, вы можете сделать:

var=$(printf '%s\t%s\n' "$old" "$new")
# or
printf -v var '%s\t%s\n' "$old" "$new"
# or this quoting disaster
var="$old"$'\t'"$new"

ссылка:https://www.gnu.org/software/bash/manual/bashref.html#index-printf

-1
13.03.2021, 22:45
1 ответ

Похоже, такое сложное утверждение работает

find. -mtime +225 -exec sh -c 'echo "\n" && echo File = "{}"; bkf="/mount/backup/{}"; echo Backupfile = \""${bkf}"\". ; test -f "$bkf" && echo do the touch && echo okok ; echo end' \;

где 225 — это количество дней между настоящим моментом и резервной копией (, как-то округленное, ссылка)

findexecхорошо описано здесь

Редактировать:Если у вас есть резервная копия, заархивированная с помощью tar/tar.gz , вам не нужно извлекать все файлы, вы можете просто cdперейти к резервной копии и выполнить следующую команду(ссылка :list tar content)для получения метаданных всех файлов в резервной копии:

for f in *.tar.gz ; do echo $f; tar -v -t -f $f > "/tmp/contents_backup-20200401/$f.txt"; done

(не знаю, почему опция -z не понадобилась, хотя архив был сжат с помощью gzip)

Эти данные представлены в формате таблицы ASCII с разделителями-пробелами. К сожалению, cutне может работать с переменным интервалом, ноawkможет .

Следующая процедура работает гладко (, за исключением некоторых уродливых имен файлов со знаками доллара или апострофа или скобками ). Это можно частично исправить, используя fgrepвместо grep, но на самом деле это также вывод find с помощью {}, который удаляется, когда имя файла содержит, например, знак доллара или апостроф.

перейдите к папке активной системы, затем:

find  *  -type f  -mtime +244   -exec sh -c  'echo "\n" && echo File = "{}"; lastmod=$(stat -c %y "{}" |cut -c-16); echo "LastMod TimeStamp = \""$lastmod"\"" ; dt=$(echo "$lastmod" | cut -c-10) && [ "$dt" = "2020-07-10" ] && ( echo "old file detected" ; timestamp=$(fgrep "{}" /tmp/contents_backup-20200401/backup-musik.tar.gz.txt  | head -n1 | awk -F" " '"'"'{ print $4 " " $5 }'"'"' ); echo "Backup TimeStamp  = \""${timestamp}"\"". ; test -n "$timestamp" && echo "do the touch" && touch -d "$timestamp" "{}"; echo "ret=$?" && echo okok ) ; echo end' \;

при этом:

  • 244— количество дней с момента создания резервной копии до настоящего момента (в качестве первого фильтра)
  • 2020-07-10— жестко заданная дата, будут затронуты только файлы с этой датой
  • /tmp/contents_backup-20200401/backup-musik.tar.gz.txt— это файл, сгенерированный вышеупомянутой командой

Что делает эта команда:

  • перебирать файлы в действующей системе
  • проверьте, не влияет ли на них проблема с неправильной датой (она устарела и не была ли она изменена после резервного копирования,тогда вы не хотите сбрасывать временную метку)
  • выполните поиск в списке резервных копий и найдите соответствующую запись (это не работает для папок *к сожалению, так как будет найдено много файлов, находящихся в папке)
  • с помощью awkполучить метку времени файла резервной копии
  • отчет об успехе

*)дату и время папки можно установить с помощью этой команды на основе последнего файла в этой папке (на самом деле это необходимо применять ко всем папкам рекурсивно)

stat -c %y. && touch -r "$(find -mindepth 1 -maxdepth 1 -printf '%T+=%p\n' | sort |tail -n 1 | cut -d= -f2-)". && stat -c %y.

Редактировать 2 :экранирование(одиночного апострофа)с использованием правильного синтаксиса иногда бывает затруднено.

Редактировать3 :Эта команда может быть выполнена в любой подпапке, что может привести к не -уникальным совпадениям при поиске резервной копии, поэтому об этом также будет сообщено:

find  *  -type f  -mtime +244   -exec sh -c  'echo "\n" && echo File = "{}"; lastmod=$(stat -c %y "{}" |cut -c-16); echo "LastMod TimeStamp = \""$lastmod"\"" ; dt=$(echo "$lastmod" | cut -c-10) && [ "$dt" = "2020-07-10" ] && ( echo "old file detected" ; filelist=$(fgrep "{}" /tmp/contents_backup-20200401/backup-dokumente.tar.gz.txt); filecount=$(echo "$filelist"|wc -l); echo "file count = $filecount"; [ "$filecount" -gt "1" ] && echo "multiple files found" ; timestamp=$(echo "$filelist" | head -n1 | awk -F" " '"'"'{ print $4 " " $5 }'"'"' ); echo "Backup TimeStamp  = \""${timestamp}"\"". ; [ $(echo -n "$timestamp" | wc -m) = 16 ] && echo "do the touch" && touch -d "$timestamp" "{}"; echo "ret=$?" && echo okok ) ; echo end' \;
0
18.03.2021, 22:29

Теги

Похожие вопросы