sudo
- это команда, которая выполняет любую следующую команду от имени другого пользователя (если имя пользователя не указано, как в этом случае, этот пользователь - root
) - для этого учетная запись, из которой выполняется sudo
, должна иметь необходимые настройки разрешений (см. / etc / sudoers
)
su
запускает новую оболочку под другим идентификатором пользователя
-s / bin / bash
указывает запускаемую оболочку, то есть / bin / bash
-
делает эту оболочку оболочка входа
foo
- это пользователь, с идентификатором пользователя и идентификатором группы которого будет запущена новая оболочка
Вместо использования чистой команды find
вы можете комбинировать find
с циклом while read
или GNU parallel
. Оба, вероятно, будут быстрее, чем find
-exec
, поскольку вы не запускаете новую оболочку для каждого пути, найденного find
.
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
Если доступно, сохраните счетчик в /dev/shm/
, чтобы предотвратить запись на диск.
=> Используйте /dev/shm/find_increment
вместо ~/find_increment
.