Вопрос отмечен bash
, это только в пользу пользователей других оболочек.
В POSIX sh сценарий (для мобильности):
i=10
while [ "$i" -le 100 ]; do
./prog "$i"
i=$(($i+10))
done
В Границе sh сценарий (для совместимости к системам пред90-х):
echo '0[10+pd100>x]dsxx' | dc | xargs -n 1 ./prog
В zsh
(для людей, не вынужденных использовать bash
):
i=0; repeat 10 ./prog $((i+=10))
Или
for i ({1..10}0) ./prog $i
или:
for ((i=10;i<=100;i+=10)) ./prog $i
или:
zargs -n1 {1..10}0 -- ./prog
Один из вариантов - использовать rsync с - remove-source-files
rsync -vr --remove-source-files /mnt/originals-us/ /mnt/originals/
Возможное предупреждение: я не знаю, как rsync проверяет наличие свободного места перед выполнением потенциально опасных действий. В идеальном мире rsync вычислит, сколько места необходимо, проверит, доступно ли оно, затем прервет работу и предупредит пользователя или (если места достаточно) выполнит операцию.
РЕДАКТИРОВАТЬ: Я по ошибке пропустил параметр рекурсии ( -r
), спасибо OP за упоминание, теперь исправлено
Решение 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
).