Баш | Скопируйте файлы в несколько папок и удалите их скриптом

Мне нужно скопировать некоторые файлы (100 КБ/файл) из одной папки X в папки Y и B, после чего я должен удалить файлы, а не папки. До сих пор легко, но папка X будет почти непрерывно получать файлы, и я могу подумать, что может быть случай, когда скрипт сначала скопирует 5 файлов в X, затем 8 в Y и удалит 10, потому что файлы поступают непрерывно.

Я протестировал 2000 файлов, и все работало отлично. Но я должен быть на 100% уверен, что не потеряю ни одного файла.

Это мой сценарий:

cp -R -v /$RootPath/MAPADMIN/$Client/Inbox/* /$RootPath/$Client/Inbox/ >> log.txt
cp -R -v /$RootPath/MAPADMIN/$Client/Inbox/* /$RootPath/Backup/$Client/Inbox >> log.txt
find /$RootPath/MAPADMIN/$Client/Inbox/ -maxdepth 2 -type f -delete >> log.txt

Этот сценарий ИДЕАЛЬЕН для моей ситуации, но я должен быть на 100% уверен, что у меня 0% потерянных файлов. Есть ли кто-то, кто тестировал что-то подобное так долго, или кто-то, кто может помочь мне улучшить его.

Благодарю вас!


person Theodor    schedule 11.10.2017    source источник
comment
Обратите внимание, что ваши исходные файлы также могут изменяться (расти) во время копирования... Я бы перебирал исходные файлы и на каждой итерации вычислял md5sum текущего файла, копировал его в две папки назначения и проверял, что его md5sum не изменился. Если это не так, удалите исходный файл. Если это так, удалите две копии, но не источник. Решит ли это вашу проблему?   -  person Renaud Pacalet    schedule 11.10.2017


Ответы (2)


Я предлагаю использовать в этом случае rsync, он надежнее.

rsync  -arv /$RootPath/MAPADMIN/$Client/Inbox/ $RootPath/$Client/Inbox 2>&1 >> log.txt
rsync  -arv /$RootPath/MAPADMIN/$Client/Inbox/ /$RootPath/Backup/$Client/Inbox 2>&1 >> log.txt
find /$RootPath/MAPADMIN/$Client/Inbox/ -maxdepth 2 -type f -delete >> log.txt
person medismail    schedule 11.10.2017
comment
Не могли бы вы предоставить мне пример, основанный на моем сценарии? - person Theodor; 12.10.2017

Я обновлял так:

files=(*.*)

if [ "$files" != "*.*" ]
then

for file in "${files[@]}"; do

        cp "/$RootPath/$1/Outbox/$folder$file" /$RootPath/MAPADMIN/$1/Outbox/$folder
        mv "/$RootPath/$1/Outbox/$folder$file" /$RootPath/Backup/$1/Outbox/$folder
done
fi

Я ищу каждую папку в этом каталоге, а затем в каждой папке я ищу каждый файл, и я иду один за другим. Осталось 3 месяца и почти 50 000 файлов были перемещены с помощью скрипта выше с 0% потерь.

Я надеюсь, что это будет полезно для кого-то еще.

person Theodor    schedule 02.02.2018