Команда оболочки 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
Похоже, такое сложное утверждение работает
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 — это количество дней между настоящим моментом и резервной копией (, как-то округленное, ссылка)
find
exec
хорошо описано здесь
Редактировать:Если у вас есть резервная копия, заархивированная с помощью 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' \;