2014-11-14 5 views
8

У меня есть целая куча файлов на сервере, и я хочу загрузить их на S3. Файлы хранятся с расширением .data, но на самом деле это всего лишь набор jpeg, png, zips или pdf.Загрузка файлов на s3 с помощью s3cmd параллельно

Я уже написал короткий скрипт, который находит тип mime и загружает их на S3, и это работает, но оно медленное. Есть ли способ сделать следующий запуск с использованием gnu parallel?

#!/bin/bash 

for n in $(find -name "*.data") 
do 
     data=".data" 
     extension=`file $n | cut -d ' ' -f2 | awk '{print tolower($0)}'` 
     mimetype=`file --mime-type $n | cut -d ' ' -f2` 
     fullpath=`readlink -f $n` 

     changed="${fullpath/.data/.$extension}" 

     filePathWithExtensionChanged=${changed#*internal_data} 

     s3upload="s3cmd put -m $mimetype --acl-public $fullpath s3://tff-xenforo-data"$filePathWithExtensionChanged  

     response=`$s3upload` 
     echo $response 

done 

Также я уверен, что этот код может быть значительно улучшен в целом :) Отзывы были бы весьма полезными.

+0

Параллельная загрузка возможна с Python и бота – helloV

+1

Нодом Я мог бы написать что-то в дороге или на другом языке, но я пытался сделать это «все в Баше» .. без особой причины. –

+0

[Возможное решение здесь] (http://blog.aclarke.eu/moving-copying-lots-of-s3-files-quickly-using-gnu-parallel/) – helloV

ответ

8

Вы явно опытный в письменном виде оболочки, и очень близко к решению:

s3upload_single() { 
    n=$1 
    data=".data" 
    extension=`file $n | cut -d ' ' -f2 | awk '{print tolower($0)}'` 
    mimetype=`file --mime-type $n | cut -d ' ' -f2` 
    fullpath=`readlink -f $n` 

    changed="${fullpath/.data/.$extension}" 

    filePathWithExtensionChanged=${changed#*internal_data} 

    s3upload="s3cmd put -m $mimetype --acl-public $fullpath s3://tff-xenforo-data"$filePathWithExtensionChanged  

    response=`$s3upload` 
    echo $response 
} 
export -f s3upload_single 
find -name "*.data" | parallel s3upload_single 
+0

Awesome Спасибо! если я прочитаю это право, это запустит все файлы, которые 'find-name '* .data" 'возвращает и запускает каждый из них параллельно? Если это так здорово, но я предполагаю, что это упадет, если 'find -name '* .data" 'вернется, скажем, файлы uhh 80k –

+1

Почти:' parallel' по умолчанию для одного процесса на ядро ​​процессора. Если вы хотите запустить как можно больше, используйте 'parallel -j0'. Это все равно не будет запускаться 80k параллельно, но перестает появляться, когда больше нет обработок или процессов. –

+0

Спасибо, Оле! :) Я многому научился от этого :) –

1

вы можете просто использовать s3cmd-modified, который позволяет поставить/получить/синхронизации с несколькими рабочими параллельно

$ git clone https://github.com/pcorliss/s3cmd-modification.git $ cd s3cmd-modification $ python setup.py install $ s3cmd --parallel --workers=4 sync /source/path s3://target/path