find -exec и инкремент счетчика / progress

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

su запускает новую оболочку под другим идентификатором пользователя

-s / bin / bash указывает запускаемую оболочку, то есть / bin / bash

- делает эту оболочку оболочка входа

foo - это пользователь, с идентификатором пользователя и идентификатором группы которого будет запущена новая оболочка

2
10.05.2019, 15:25
2 ответа

Вместо использования чистой команды findвы можете комбинировать findс циклом while readили GNU parallel. Оба, вероятно, будут быстрее, чем find-exec, поскольку вы не запускаете новую оболочку для каждого пути, найденного find.

Решение с использованием GNU Parallel

GNU parallelимеет следующие преимущества по сравнению сwhile read:

  • Легче понять правильно. IFS=и -rне нужны.
  • Встроено -в переменную номера задания {#}.
    Более удобные строки замены см. в учебнике .
  • Легко распараллелить при необходимости.
    Удалите -j1, и по умолчанию у вас будет столько воркеров, сколько ядер.
script='
    echo Processing job number {#}
    new_path="/new/path/$(basedir {})"
    [ -d "$new_path" ] || mv {} "$new_path"
'
find … -print0 | parallel -0 -j1 "$script"

{}заменяется на parallelправильно процитированной записью, прочитанной из stdin. Не цитируйте {}снова.

parallelвыполняет скрипт с той же оболочкой, из которой вы его запустили. Если вы начали parallelв bash, вы можете использовать функции bashв скрипте.

Решение Использование во время чтения

find … -print0 |
while IFS= read -r -d '' old_path; do
    echo Processing job number "$((++job))"
    new_path="/new/path/$(basedir "$old_path")"
    [ -d "$new_path" ] || mv "$old_path" "$new_path"
done 
3
27.01.2020, 22:02

Если доступно, сохраните счетчик в /dev/shm/, чтобы предотвратить запись на диск.

=> Используйте /dev/shm/find_incrementвместо ~/find_increment.

0
27.01.2020, 22:02

Теги

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