Предположив дату GNU, вы получите почти правильную команду в вашем вопросе: [12123] Чтобы получить точную строку [11654]4 мая [11655], используйте следующее:[12124]
У вас так много файлов в / tmp
, что вы не можете поместить все имена в командной строке одновременно (версия, которая у вас установлена также небезопасно, если в любых путях есть пробелы).
Хорошая новость заключается в том, что find
может сделать это за вас правильно и безопасно:
find /tmp -exec touch -c '{}' +
найдет все файлы, как и раньше, а затем выполнит touch
столько раз, сколько необходимо. с таким количеством файлов, которое уместится каждый раз.
find
-exec
параметр принимает команду для запуска для совпадающих файлов и заменяет пути, где находится {}
. +
означает, что команда запускает сразу несколько файлов, или \;
запускает touch
один раз для каждого файла.
Как отмечено в комментариях, -execdir touch -c '{}' \;
здесь строго безопаснее, хотя, вероятно, будет немного медленнее, и от этого мало пользы. однопользовательская система. Он позволяет избежать определенных состояний гонки, сначала переключаясь в каждый подкаталог, а затем каждый раз выполняя команду только для файлов в этом каталоге. Параметр -execdir
является нестандартным расширением, но он поддерживается в GNU , FreeBSD , OpenBSD , NetBSD и OS X найти
s; в других коммерческих Unix его обычно нет. Я не уверен, что вы используете, но примите во внимание вышеизложенное, если это применимо.
Основная проблема с обратным вызовом в вопросе заключается в том, что сначала команда find перечисляет все файлы в /tmp, а затем передает этот (огромный) список в качестве аргументов в touch
, что слишком много для одного вызова. Также существует проблема, если имена файлов содержат пробелы, новые строки, точки с запятой, амперсанды, трубчатые символы и т.п.
Лучше использовать эту конструкцию:
find /tmp -type f -exec touch -c '{}' +
Команда find
рекурсивно перечисляет все файлы (каталоги, симлинки, специальные устройства также являются "файлами" в unix) в разделе /tmp
.
-тип f
указывает найти только обычные файлы
Опция -c
для touch
предотвращает касание при создании файлов, которые не существуют.
Кажется, в вашем примере вы пропустили какую-то логику, но если вы захотите сделать это только 200 раз, вы можете попробовать следующее:
#!/bin/bash dayNo=1 while test $dayNo -le 200 do find /tmp -type f -exec touch -c '{}' + sleep 86000 dayNo=$(expr 1 + ${dayNo}) done
Оболочка подставляет результат выражения в обратных кавычках в строку. Но в системе есть ограничения на длину списка аргументов для команды. Итак, если у вас есть несколько тысяч файлов в / tmp, он пытается создать команду с тысячами имен в качестве аргумента. Это не удается.
Есть несколько способов сделать это проще. Найти можно сам запустить команду. Большинство современных версий позволяют разделить его и запустить несколько отдельных команд touch
, каждая из которых не превышает установленного лимита.
find /tmp -exec touch {} +