Intereting Posts
Нужно ли передавать файлы tar через «rsync» в режиме архивации? OpenVPN блокирует SMTP-сервер доступа полностью Хотите отсортировать файлы по дате обновления, включая подкаталоги NTFS-3G: все файлы являются «неподдерживаемой точкой повторной обработки», Невозможно использовать bonnie ++ для измерения производительности ввода / вывода Виртуальный бокс Oracle и клавиатурные шпионы Запустите фоновый процесс из сценария и управляйте им, когда скрипт заканчивается Ошибка туннелирования SSH: «канал 1: сбой при открытии: административно запрещено: открыть сбой» Я не могу отправить почту на адрес Gmail, используя Postfix что такое цель группы «nogroup» grep список имен и информации из большего файла GNOME 3.22 – Отключить F1 Help Key создание пользователя add Как я могу проверить, запущен ли мой cronjob на моем сервере через PHP? Случайное удаление каталога / lib в Fedora 15

Как удалять временные метки файлов на 3 месяца (для дерева каталогов)?

Я рассматриваю утилиту командной строки touch (в Linux), и из примеров, которые я нашел в учебных пособиях , я вижу, как можно ударить метку времени доступа или изменения в указанное время, текущее время или ссылочный файл.

Тем не менее, я хотел бы сделать следующее: относительный возраст моих файлов (относительно друг друга) имеет ценную для меня информацию, и я не хочу этого потерять. Но мне нужно, чтобы каждый файл в (рекурсивных) папках выглядел на несколько месяцев моложе, чем они есть. Поэтому каждый файл может ссылаться на себя, ударять время, но применять его к каждому файлу в дереве папок. Каков хороший способ сделать это?

 #!/bin/bash FILES=$(find $HIGHEST_FOLDER -type f -name *.*) for f in $FILES do touch -ram f -F 7776000 f # bumping access and modification timestamps by 3 months? done 

Или мне лучше использовать find -exec как предложено в этом ответе? (В этих папках много файлов.) Как это могло бы работать?

Предполагая, что вы находитесь в системе Linux или, по крайней мере, у вас есть привязка GNU и GNU, вы можете сделать (в bash; zsh – то же самое, но не требуется shopt globstar ):

 $ shopt globstar $ for f in **; do touch -d "$(date -d "$(stat -c '%y' "$f") +3 months")" "$f" done 

Это, однако, будет игнорировать скрытые файлы. Чтобы сопоставить их, запустите shopt -s dotglob до этих команд.

объяснение

  • shopt -s globstar : Это устанавливает опцию globstar bash, что означает, что ** будет соответствовать всем файлам и нулю или более каталогам и подкаталогам.
  • shopt -s dotglob : делает *** ) также совпадают файлы, имена которых начинаются с shopt -s dotglob . ,
  • for f in **; do ...; done for f in **; do ...; done : перебирать все файлы и каталоги , сохраняя их как $f .
  • stat -c '%y' "$f" : это текущая отметка времени текущего файла или каталога.
  • date -d $(...) +3 months : печатать дату, которая составляет три месяца после данной строки (в этом случае эта строка является результатом команды stat на $f ).

Все вместе вышесказанное найдет дату изменения каждого файла или каталога в текущей папке (включая все подкаталоги) и установит ее дату через три месяца после того, что она есть сейчас.

Из описания проблемы я считаю, что вы ищете инструмент, который может получить время последней модификации файла, а затем добавить к нему 3 месяца. Вы можете сделать это с помощью stat + touch + некоторой арифметической оценки оболочки. Например, чтобы добавить отметку времени в 90 дней, вы можете написать

 touch -d "@$(( $(stat -c '%Y' file) + 90*24*3600 ))" file 

Затем просто переверните все file вам нужны.

Я бы использовал -exec find – oneliner.

 find $HIGHEST_FOLDER -type f -name '*.*' -exec touch -d "$(date -d "$(stat -c '%y' {}) +3 months")" {} \; 

Quote *.* , В противном случае find примет имена файлов из текущего каталога и завершится с ошибкой.

Наконец, вы ДОЛЖНЫ указать \; , обратная косая черта, сопровождаемая -exec , -exec обязывает это. {} – найденный найденный файл.

Не существует переключателя -F для -F GNU, поэтому ваш пример не работает. Существуют также многочисленные проблемы с синтаксисом:

В вашем цикле for выше вы должны изменить f на $ f:

 touch [...] $f 

В противном случае он будет искать файл с именем f в текущем каталоге и изменить его дату x раз, где x – количество файлов в $HIGHEST_FOLDER .

Если вы придерживаетесь подчиненной оболочки ( $(...) перед вашим циклом), вы должны убедиться, что в $HIGHEST_FOLDER задан параметр $HIGHEST_FOLDER .