Как рекурсивно обновить время изменения файлов с помощью touch?

Вопрос или проблема

Мне нужно изменить временные метки примерно 5000 файлов.

Вводить touch file1.txt, touch file2.txt будет занимать у меня вечность.

Существует ли способ сделать что-то вроде touch -R *?

Вы можете использовать команду find для поиска всех ваших файлов и выполнения touch на каждом найденном файле с помощью -exec

find . -type f -exec touch {} +

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

find . -type f -name "*.txt" -exec touch {} +

Ответ g_p устанавливает временную метку “сейчас”, но если, например, вы забыли параметр cp -p и вам нужно заменить временные метки на их оригиналы рекурсивно, не копируя все файлы заново. Вот что сработало для меня:

find /Destination -exec bash -c 'touch -r "${0/Destination/Source}" "$0"' {} \;

Это предполагает дублирующее дерево файлов/папок Source: /Source и Destination: /Destination

  1. find ищет в Destination все файлы и директории (которые нуждаются во временных метках), а -exec ... {} выполняет команду для каждого результата.
  2. bash -c ' ... ' выполняет команду оболочки, используя bash.
  3. $0 содержит результат find.
  4. touch -r {timestamped_file} {file_to_stamp} использует команду замены bash ${string/search/replace} для правильной установки источника временной метки.
  5. Каталоги Source и Destination заключены в кавычки, чтобы обработать каталоги с пробелами.

touch **/**

Это обновляет временные метки всех файлов и директорий рекурсивно в текущей директории при использовании Zsh или bash -O globstar.

Ответ или решение

Для изменения временных меток большого количества файлов, таких как 5000, вы можете воспользоваться несколькими методами, которые описаны ниже. Эти подходы основаны на использовании командной оболочки UNIX/Linux и могут эффективно применять команду touch рекурсивно.

1. Использование команды find

Команда find является мощным инструментом для поиска файлов и выполнения операций с ними. Чтобы изменить временную метку всех файлов в текущем каталоге и всех его подкаталогах, используйте следующую команду:

find . -type f -exec touch {} +
  • Здесь . обозначает текущий каталог.
  • -type f указывает, что нужно искать только файлы.
  • -exec touch {} + выполняет команду touch для каждого найденного файла.

Фильтрация по расширению файла

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

find . -type f -name "*.txt" -exec touch {} +

Это позволит обновить временные метки только для файлов с расширением .txt.

2. Копирование временных меток из одного места в другое

Если у вас есть структура папок с файлами, и вам нужно скопировать временные метки из одного каталога (например, /Source) в другой (/Destination), вы можете использовать следующую конструкцию:

find /Destination -exec bash -c 'touch -r "${0/Destination/Source}" "$0"' {} \;
  • Это предполагает, что у вас есть такая же структура каталогов в обоих местах.
  • bash -c '...' выполняет команды bash.
  • touch -r используется для задания временной метки на основе другого файла.

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

3. Использование расширенной возможности glob в Zsh

Если вы используете оболочку Zsh, вы можете использовать следующий подход:

touch **/*

Этот вариант обновляет временные метки всех файлов и директорий в текущем каталоге и его подпапках за счёт использования опции расширенного поиска.

Если вы используете bash, сначала включите поддержку globstar:

shopt -s globstar
touch **/*

Резюме

Эти методы обеспечивают эффективность и позволяют быстро модифицировать временные метки большого количества файлов. Выбор между find и glob зависит от ваших предпочтений и специфики задачи. Правильное использование этих команд сэкономит ваше время и ресурсы, улучшая производительность ваших операций с файлами.

Оцените материал
Добавить комментарий

Капча загружается...