Подтвердить что ты не робот

Используя find с -exec {}, есть ли способ подсчитать общее количество?

Я использую команду, подобную этой:

find . -name "*.php" -exec chmod 755 {} \;

Хотя я не использую chmod, я использую другую команду, которую я не буду перечислять здесь. Эта команда работает нормально. Тем не менее, есть тысячи файлов и каталогов, которые будут работать, и эта операция занимает некоторое время. Мне интересно, есть ли способ показать какую-то сумму при завершении операции? Возможно, количество измененных файлов?

Единственное, о чем я могу думать, это просто сделать что-то вроде:

find . -name "*.php" -exec chmod 755; echo "+"; {} \;

Будет ли это работать? По крайней мере, мы можем видеть, что что-то происходит... У кого-то есть лучшее предложение?

4b9b3361

Ответ 1

Это работает:

$ find . -name "*.php" -exec chmod 755 {} \; -exec /bin/echo {} \; | wc -l

Для этого вам нужно включить второй -exec /bin/echo. Если команда find не имеет выхода, то wc не имеет ввода для подсчета строк для.

Ответ 2

Вы можете связать несколько команд -exec с помощью одной команды find. Синтаксис для этого:

find . -exec cmd1 \; -exec cmd2 \; -exec cmd3 \;

который в вашем случае будет выглядеть следующим образом:

find . -name '*.php' -exec chmod 755 {} \; -exec echo '+' \;

Хотя у вас есть еще несколько вариантов для этого. Вы можете перенаправить вывод в файл:

find . -name '*.php' -exec chmod 755 {} \; > logfile.txt

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

find . -name '*.php' -exec chmod 755 {} \; | tee logfile.txt
wc -l logfile.txt           // prints the lines in the file
grep -c '^+$' logfile.txt   // prints the lines containing a single '+'

Ответ 3

find . -name "*.php" -exec chmod 755 {} + -printf '.' | wc -c

Если вы используете + вместо ";", find попытается обработать chmod 755 на многих файлах параллельно.

Вы можете выполнять дополнительные команды после первого, здесь, например, распечатать точку и подсчитать точки в конце.

Ответ 4

С помощью опции -exec find начнет подпроцесс для каждого найденного файла. Вы можете ускорить это, используя xargs как find . -name '*.php' | xargs chmod 755 - chmod запускается только один раз.

Ответ 5

Вы можете использовать xargs и pv. Возможно:

find . -name "*.php" | pv --line-mode | xargs chmod 755

Примечание: это будет работать, только если ваши *.php файлы не имеют пробелов или других нечетных символов в пути или имени.