Рандомизировать группу дат модификации

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

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

Пример каталога

Я знаю, что можно коснуться нескольких файлов за один раз, используя touch -t YYYYMMDDhhmm file1 file2 file3, однако есть ли способ автоматизировать этот процесс со случайной датой?

Платное приложение A Better Finder Attributes может изменять даты файлов: A Better Finder Attributes 6 дает вам полный контроль над датами создания и изменения файлов, устанавливая их на определенное время и дату, добавляя или удаляя время или просто удаляя их полностью. Отказ от ответственности: я довольный пользователь ABFA. Никаких финансовых или иных связей с Publicspace.net.
@IconDaemon Спасибо за рекомендацию ABFA, однако причина, по которой мне нужно автоматизировать процесс, заключается в том, что у меня есть много папок, вложенных в другие папки, подобные этому примеру дерева каталогов в вопросе. Это, а также выбор даты вручную, я могу использовать сенсорный ввод вместо ABFA.

Ответы (1)

Это необычная просьба. Я не уверен, почему вы хотели бы это сделать, но это вызвало у меня интерес. Мы будем использовать jotдля выбора случайное число от 1 до 16000.

jot -r 1 1 16000

Это будет количество часов, которое мы вычтем из текущей даты.

seed=$(jot -r 1 1 16000)
date -v-"$seed"H "+%Y%m%d%H%M.%S"

Обратите внимание, что dateвыше форматирует дату для работы с сенсорным экраном.

Теперь мы используем findсписок всех каталогов в текущем рабочем каталоге и используем «встроенный» скрипт для доступа ко всем объектам файловой системы в каждом каталоге с уникальным временем модификации в каждом каталоге.

find . ! -name '.' -type d -exec bash -c ' for dir
    do
        seed=$(jot -r 1 1 16000)
        echo touch -t "$(date -v-"$seed"H "+%Y%m%d%H%M.%S")" "${dir}/"*
    done
' sh {} \;

Мы еще не закончили, потому что мы без разбора изменили время модификации вложенных каталогов. Нам нужно уникальное время модификации для каждого каталога.

find . ! -name '.' -type d -exec bash -c ' for dir
    do
        seed=$(jot -r 1 1 16000)
        echo touch -t "$(date -v-"$seed"H "+%Y%m%d%H%M.%S")" "${dir}"
    done
' sh {} \;

И чтобы собрать все это вместе-

#! /bin/ksh

find . ! -name '.' -type d -exec bash -c ' for dir
    do
        seed=$(jot -r 1 1 16000)
        echo touch -t "$(date -v-"$seed"H "+%Y%m%d%H%M.%S")" "${dir}/"*
    done
' sh {} \;


find . ! -name '.' -type d -exec bash -c ' for dir
    do
        seed=$(jot -r 1 1 16000)
        echo touch -t "$(date -v-"$seed"H "+%Y%m%d%H%M.%S")" "${dir}"
    done
' sh {} \; 

Этот сценарий может завершиться ошибкой, если вы превысите значение ARG_MAX, и в настоящее время он будет отображать только те изменения, которые может внести касание. Вы можете удалить echoперед, touchчтобы внести изменения. Имейте в виду, что этот сценарий прошел ограниченное тестирование и предлагается КАК ЕСТЬ.

Я кровавая Легенда!! Я хотел только для каждого файла для каждой папки в каталоге, но я думаю, у меня есть возможность коснуться папок! Что касается причины: скажем так, я просматриваю эти файлы и со временем могу как бы предсказать, что будет дальше. Только одна ошибка, которая была легко исправлена, числа, полученные из генератора дат, не включали десятичную дробь для требуемых секунд touch, однако это было легко %Sисправить, просто удалив .
@MrU Спасибо, что указали на ошибку. Каким-то образом точка была потеряна при преобразовании kshфункции даты в использование внешней dateкоманды для bash.