2011-11-17 3 views
0

Это мое первое сообщение, хотя я очень часто приходил сюда для решений! Я не мог найти ответ на вопрос, который у меня есть. Возможно, я использую неправильные теги в моем поиске:/В любом случае, пожалуйста, простите меня заранее, если вопрос был задан раньше.Автоматическое разбиение списка файлов

Я хочу создать небольшой скрипт для автоматической загрузки фотографий и видео из папки. В настоящее время я использую Perl-скрипт под названием «flickr_upload», который находится в каталоге macports.

Предположим, у меня есть 12 файлов в каталоге. Я хочу разбить эти 12 файлов в 3 партии по 4 файла и запустить 3 командной строки параллельно, используя xterm, например.

Как можно автоматически разбить список, просто указав количество партий?

С уважением

Edit: вместо:

flickr_upload photo01.jpg photo02.jpg photo03.jpg 

Я хотел бы иметь:

flickr_upload photo01.jpg 
flickr_upload photo02.jpg 
flickr_upload photo03.jpg 

написав что-то вроде:

split -n 3 ./*.jpg | xterm flickr_upload - 

ответ

1

xargs может сделать это за вас.

например, seq 10 | xargs echo echos все 10 «аргументов» сразу. Но seq 10 | xargs -n 3 echo делает их 3, в то время:

1 2 3 
4 5 6 
7 8 9 
10 

Я ничего о flickr_upload или что «MacPorts» может быть не знаю, но по-видимому вы можете сделать это:

ls *jpg | xargs -n 3 flickr_upload

+0

Спасибо за подсказку! Действительно, он делает то, что я хотел, хотя мне нужно вычислить modulo + 1 для вычисления правильного значения для n;) – caccialdo

+0

Mac Ports очень похож на систему портов в стиле UNIX, но портирован на OS X. Неоценимый отзыв! –

1

Если вы имеют GNU Parallel http://www.gnu.org/software/parallel/ установлены вам не нужно вычислить по модулю + 1:

seq 100 | parallel -X -j 3 echo 

Если вы просто хотите uploa d 3 параллельно (с 3 работает все время):

seq 100 | parallel -j 3 echo 

Вы можете установить GNU Parallel просто:

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel 
chmod 755 parallel 
cp parallel sem 

Смотреть интро видео для GNU Parallel, чтобы узнать больше: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

1

xargs может запустить несколько потоков:

cat list_of_files | xargs --max-procs 6 -I {} upload_file {} 

И вот как осуществляется балансировка:

seq 1 10 | xargs -I {} bash -c "echo {} >> bucket_\$((\$RANDOM % 4))" 
head bucket_* 
seq 0 3 | xargs -I {} rm bucket_{} 
Смежные вопросы