Вопрос или проблема
Мне нужно изменить временные метки примерно 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
find
ищет в Destination все файлы и директории (которые нуждаются во временных метках), а-exec ... {}
выполняет команду для каждого результата.bash -c ' ... '
выполняет команду оболочки, используя bash.$0
содержит результат find.touch -r {timestamped_file} {file_to_stamp}
использует команду замены bash${string/search/replace}
для правильной установки источника временной метки.- Каталоги 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
зависит от ваших предпочтений и специфики задачи. Правильное использование этих команд сэкономит ваше время и ресурсы, улучшая производительность ваших операций с файлами.