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

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

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

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

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

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

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

  • Извлечь файлы с определенным расширением файла и сохранить структуру каталогов?
  • Получить количество пробелов в строке?
  • как выполнять команды на удаленном сервере как разные пользователи
  • FOR цикл не циклический
  • Как найти уникальное слово в одной строке
  • Дифференцирование между запуском и получением источника в сценарии оболочки bash?
  • Переключение пользователей с помощью sudo или su в сценарий оболочки
  • Полоскать наиболее часто используемые слова из текста
  • 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 и Unix - лучшая ОС в мире.