сценарий оболочки для автокасающихся файлов

Предположив дату GNU, вы получите почти правильную команду в вашем вопросе: [12123] Чтобы получить точную строку [11654]4 мая [11655], используйте следующее:[12124]
1
20.08.2014, 23:27
3 ответа

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

Хорошая новость заключается в том, что find может сделать это за вас правильно и безопасно:

find /tmp -exec touch -c '{}' +

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

find -exec параметр принимает команду для запуска для совпадающих файлов и заменяет пути, где находится {} . + означает, что команда запускает сразу несколько файлов, или \; запускает touch один раз для каждого файла.


Как отмечено в комментариях, -execdir touch -c '{}' \; здесь строго безопаснее, хотя, вероятно, будет немного медленнее, и от этого мало пользы. однопользовательская система. Он позволяет избежать определенных состояний гонки, сначала переключаясь в каждый подкаталог, а затем каждый раз выполняя команду только для файлов в этом каталоге. Параметр -execdir является нестандартным расширением, но он поддерживается в GNU , FreeBSD , OpenBSD , NetBSD и OS X найти s; в других коммерческих Unix его обычно нет. Я не уверен, что вы используете, но примите во внимание вышеизложенное, если это применимо.

4
27.01.2020, 23:17

Основная проблема с обратным вызовом в вопросе заключается в том, что сначала команда 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
0
27.01.2020, 23:17

Оболочка подставляет результат выражения в обратных кавычках в строку. Но в системе есть ограничения на длину списка аргументов для команды. Итак, если у вас есть несколько тысяч файлов в / tmp, он пытается создать команду с тысячами имен в качестве аргумента. Это не удается.

Есть несколько способов сделать это проще. Найти можно сам запустить команду. Большинство современных версий позволяют разделить его и запустить несколько отдельных команд touch , каждая из которых не превышает установленного лимита.

find /tmp -exec touch {} +
1
27.01.2020, 23:17

Теги

Похожие вопросы