Решение rsync
намного эффективнее, но это возможно и с find
. Худший случай: один процесс на файл:
find ... -exec cp --parents {} /dest/path \; -delete
find
удалит исходный файл только после успешного копирования.
Но мы можем запустить проект «весело с поиском» для оптимизации (удалите echo
s и \
перед |
после тестирования):
find ... -type d -exec echo mkdir /target/{} \; -exec bash -c \
'echo find {} -maxdepth 1 -type f -print0 \| '\
'xargs -0 mv --target-directory=/target/{}' \;
В типичном случае: 5 процессов на каталог.
В вашем примере (несколько файлов в каталоге) может иметь смысл создать -print0 | xargs -0 mkdir
в целевом корне сначала (и убрать mkdir
из основного вызова find
).
Ваш скрипт не -переносимый (, так как вы используете let
и ((.. ))
), сбивает с толку (, так как вы используете иlet
и((.. ))
), отсутствует в документации (нет комментариев, а имена переменных не являются -описательными )и незначительно небезопасными (, поскольку вы не указали расширение$t
).
Если хотите переписать, вот мой:
#!/bin/sh
min_duration=500
t_start=$(date +%s)
# script is here
t_end=$(date +%s)
elapsed=$(( t_end - t_start ))
# sleep long enough to make sure 'min_duration' seconds has elapsed,
# but at least 1 second
sleep "$(( elapsed < min_duration ? min_duration - elapsed : 1 ))"
Вот как это сделать, используя bash
специальный параметрSECONDS
:
#!/bin/bash
SECONDS=0
# script is here
sleep "$(( 500 > SECONDS ? 500 - SECONDS : 1 ))"
Обычно SECONDS
возвращает время (в секундах )с момента запуска скрипта, но можно присвоить любое значение (или )установить таймер.