Перемещение больших количеств файлов и каталогов к другому каталогу

Вопрос отмечен 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
3
22.02.2014, 01:42
2 ответа

Один из вариантов - использовать rsync с - remove-source-files

rsync -vr --remove-source-files /mnt/originals-us/ /mnt/originals/

Возможное предупреждение: я не знаю, как rsync проверяет наличие свободного места перед выполнением потенциально опасных действий. В идеальном мире rsync вычислит, сколько места необходимо, проверит, доступно ли оно, затем прервет работу и предупредит пользователя или (если места достаточно) выполнит операцию.

РЕДАКТИРОВАТЬ: Я по ошибке пропустил параметр рекурсии ( -r ), спасибо OP за упоминание, теперь исправлено

6
27.01.2020, 21:10

Решение 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 ).

3
27.01.2020, 21:10

Теги

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