Сценарий оболочки для копирования одного файла за раз в задании cron - PullRequest
0 голосов
/ 06 мая 2020

У меня есть несколько файлов csv в расположении A, например,

abc1.csv, abc2.csv, abc3.csv

У меня есть задание cron, которое запускается каждые 30 минут и при каждом выполнении Я хочу скопировать только 1 файл (который не должен повторяться) и поместил его в папку B

У меня было два способа сделать это 1) Я выберу первый файл в списке файлов и скопируйте его в место B и удалите его после копирования. Проблема в том, что я не уверен, когда файл будет полностью скопирован, и если я удалю его до его завершения, это может быть проблемой 2) У меня будет временная папка. я скопирую файл из местоположения A в местоположение B, а также сохраню его во временном местоположении. На следующей итерации, когда я выберу файл из списка файлов, я сравню его существование в местоположении временного файла. Если он существует, я перейду в следующий файл. Думаю, это займет больше времени et c.

Пожалуйста, подскажите, есть ли другой лучший способ

Ответы [ 3 ]

1 голос
/ 06 мая 2020

вы можете использовать этот bash скрипт для своего варианта использования:

source="/path/to/.csv/directory"
dest="/path/to/destination/directory"

cd $source

for file in *.csv
do
        if [ ! -f $dest/"$file" ]
        then
                cp -v $file $dest
                break
        fi
done
1 голос
/ 06 мая 2020

Вы можете убедиться, что вы переместили уже скопированный файл с помощью:

cp abc1.csv destination/ && mv abc1.csv.done

(здесь вы можете сделать свой logi c, чтобы находить только *.csv файлы и не учитывать *.done файлы .., которые уже были обработаны вашим скриптом ... или используйте любой суффикс, который хотите ..

если cp не удалось, ничего после этого не будет выполнено, поэтому файл не будет перемещен .

Вы также можете заменить mv на rm, чтобы удалить его:

cp abc1.csv destination/ && rm -f abc1.csv

Более того, вы можете добавить к вышеуказанным командам сообщения об ошибках, если вы хотите получить информацию если cp не удалось:

cp abc1.csv destination/ && mv abc1.csv.done || echo "copy of file abc1.csv failed"

И получить информацию через CRON / электронную почту

0 голосов
/ 06 мая 2020

Наконец, я взял некоторые идеи из обоих выбранных решений. Вот окончательный сценарий

source="/path/to/.csv/directory"
dest="/path/to/destination/directory"

cd $source

for file in *.csv
do
        if [ ! -f $dest/"$file" ]
        then
                cp -v $file $dest || echo "copy of file $file failed"
                rm -f $file
                break
        fi
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...