Скрипт для изменения времени изменения файлов и каталогов рекурсивно

У меня много больших папок с тысячами файлов в них, и я хочу использовать touch чтобы установить время их модификации как «оригинальное время» +3 часа.

Я получил этот скрипт из аналогичного потока в суперпользователе:

 #!/bin/sh for i in all/*; do touch -r "$i" -d '+3 hour' "$i" done 

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

У меня мало опыта использования Linux, и это моя первая настройка скрипта bash, хотя я кое-что знаю о программировании (в основном на C).

спасибо вам всем за помощь 🙂

2 Solutions collect form web for “Скрипт для изменения времени изменения файлов и каталогов рекурсивно”

Используйте find -exec для рекурсивного touch , с командами командной строки для обработки процессов.

 #!/bin/sh for i in "$@"; do find "$i" -type f -exec touch -r {} -d '+3 hour' {} \; done 

Вы можете запустить его следующим образом:

 ./script.sh /path/to/dir1 /path/to/dir2 

Правильный и полный ответ:

Чтобы изменить время доступа только с помощью команды « touch », вы должны использовать параметр « -a », иначе команда также изменит время модификации. Например, чтобы добавить 3 часа:

 touch -a -r test_file -d '+3 hour' test_file 

От человека:

 Update the access and modification times of each FILE to the current time. -a change only the access time -r, --reference=FILE use this files times instead of current time. -d, --date=STRING parse STRING and use it instead of current time 

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

 stat test_file 

Наконец, чтобы изменить время доступа только к целому каталогу, его файлам и подкаталогам, вы можете использовать команду « найти » для перемещения по каталогу и использовать параметр « -exec » для выполнения «касания» над каждым файлом и каталогом (просто не фильтруйте поиск с аргументом « type f », это не повлияет на каталоги).

 find dir_test -exec touch -a -r '{}' -d '+3 hours' '{}' \; 

От человека найти:

 -type c File is of type c: d directory f regular file 

и для -exec:

 -exec command ; Execute command; true if 0 status is returned. All following arguments to find are taken to be arguments to the command until an argument consisting of ';' is encoun- tered. The string '{}' is replaced by the current file name being processed everywhere it occurs in the arguments to the command, not just in arguments where it is alone, as in some versions of find. Both of these constructions might need to be escaped (with a '\') or quoted to protect them from expansion by the shell. See the EXAMPLES section for examples of the use of the -exec option. The specified command is run once for each matched file. The command is executed in the starting directory. There are unavoidable security problems surrounding use of the -exec action; you should use the -execdir option instead. но -exec command ; Execute command; true if 0 status is returned. All following arguments to find are taken to be arguments to the command until an argument consisting of ';' is encoun- tered. The string '{}' is replaced by the current file name being processed everywhere it occurs in the arguments to the command, not just in arguments where it is alone, as in some versions of find. Both of these constructions might need to be escaped (with a '\') or quoted to protect them from expansion by the shell. See the EXAMPLES section for examples of the use of the -exec option. The specified command is run once for each matched file. The command is executed in the starting directory. There are unavoidable security problems surrounding use of the -exec action; you should use the -execdir option instead. 

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

Наконец, чтобы использовать его в сценарии оболочки, например, «yaegashi», он сказал:

 #!/bin/sh for i in "$@"; do find "$i" -exec touch -a -r '{}' -d '+3 hours' '{}' \; done 

И запустить его, как "yaegashi" сказал:

 ./script.sh /path/to/dir1 /path/to/dir2 

Он будет искать через каждый каталог внутри dir1 и dir2 и изменять только время доступа для каждого файла и подкаталога.

  • Как автоматически сканировать документы на Linux с терминала?
  • localhost cron issue, log показывает, что cmd запущен, но сценарий фактически не запускался. Что я делаю неправильно?
  • Удаление шаблонов из строки с помощью bash
  • Команда одиночной строки для протоколирования IP-адресов
  • Сохранить список эхо-сигналов в .txt
  • Сценарий Bash для извлечения ключевых слов из текущего каталога
  • Как распечатать элемент из соответствующего ближайшего следующего столбца после поиска элемента в текущем столбце?
  • Извлечение строк между специальными символами
  • как я могу выполнить вычисление чисел из текстового файла в сценарии оболочки
  • Объединение файлов по строкам
  • Как установить дамп базы данных через Shell Script?
  • Конкретный способ вывода в файл, если задан аргумент, в stdout в противном случае
  • Interesting Posts

    Концептуальная разница между Linux и (бесплатно) ядром BSD

    Как получить уникальные строки на основе значения столбца

    новый компилятор ядра – ошибка при загрузке – Не удалось найти оверлей

    Что необходимо для получения электронной почты на субдомене?

    Linux: как найти драйвер устройства, используемый для устройства?

    Как установить последнюю версию ffmpeg из ffmpeg.org

    Почему корневой каталог на веб-сервере помещается по умолчанию в «/ var / www»?

    проблема с mysql backup и rsync

    Перенаправление пакетов из интерфейса ppp0 в интерфейс Ethernet в Linux

    Как установить dvd-слайд-шоу на Centos 5?

    определить фактическое использование памяти несколькими процессами, которые разделяют большой сегмент памяти

    В чем разница между red5 RC1 и RC2?

    Как минимизировать ненужные файлы, установленные зависимостями пакетов?

    Компилятор не находит библиотеки в / lib

    Ошибка: не удалось инициализировать библиотеку NSS на RHEL 7.3 после установки пакета libvirt

    Linux и Unix - лучшая ОС в мире.