2014-09-19 3 views
1

я хотел бы поставить сон между еа призывам к скручиванию:Возможно цепи команд с помощью xargs

ssh [email protected] "cd /export/home/someone && find . -name '*' -print| xargs -n1 curl -u someone:password ftp://somehost/tmp/ -vT" 

Не уверен, что это может быть сделано. Попробовали десятки перестановок. Может спать в начале/конце, но не между ними. Many Thanks

+0

вы можете не только сделать 'первой команды; сон 10; вторая команда 'или' первая команда && sleep 10 | вторая команда', если вам нужно трубить? – 2014-09-19 14:55:32

+1

Зачем вам нужен сон? Кроме того, это похоже на 'find/export/home/someone -exec curl -u кто-то: password -vT {} ftp: // somehost/tmp /' будет работать. – chepner

+0

Если вы используете 'bash' 4, вам даже не нужно' find': 'shopt -s globstar; curl -u кто-то: пароль -vT/export/home/someone/**/* ' – chepner

ответ

-1

Вы можете использовать петлю в этом.

ssh [email protected] "for i in `ls`; do curl -u someone:password ftp://somehost/tmp/ -vT ; sleep 10;done" 
+2

[Не анализировать вывод из' ls'] (http://mywiki.wooledge.org/ParsingLs) Просто позвольте оболочке glob это для вас. 'для i в *;'. –

2

xargs принимает единственную команду. Вам нужно получить эту единственную команду, чтобы сделать две вещи.

Попробуйте

| xargs -n1 bash -c 'curl ... "$0"; sleep ##' 

или (чтобы использовать "нормальные" позиционные аргументы, нужно заполнить $0 вручную).

| xargs -n1 bash -c 'curl ... "$1"; sleep 1' - 
+0

Возможно, я переутомил довольно телеграфный вопрос, но у меня сложилось впечатление, что они не хотят спать в начале или в конце, только между ними. – rici

+0

@rici Я думаю, вы слишком интерпретировали запрос. Я думаю, что дело в том, что они уже могли заснуть в начале * или * в конце серии, но не между вызовами (чтобы произвести задержку между запросами, например 'wget -w'), а не то, что сон в начале/в конце было неприемлемым. Но твоей интерпретации, безусловно, гораздо труднее снять. –

0

Вместо xargs вы можете использовать подоболочку:

ssh [email protected] 'cd /export/home/someone && find . -name "*" -print| (while read file; do curl -u someone:password ftp://somehost/tmp/ -vT "$file"; sleep 10; done)' 

Обратите внимание, что я также перевернутый ваши одинарные и двойные кавычки, так что местные оболочки не пытается интерпретировать $file.

2

Интересной частью этого вопроса является получение сна между кудрями, а не в начале или в конце последовательности завитушек.

Если вы не слишком много файлов, для некоторого значения «слишком много» [Примечание 1]

find . -type f --exec bash -c ' 
    doit() { curl -u someone:password ftp://somehost/tmp/ -vT; } 
    doit "$1"; for f in "${@:2}"; sleep 2; doit "$f"; done 
    ' _ {} + 

Я изменил find критерии из -name * (который будет соответствовать всем файлам и каталогам) в -type f, который будет соответствовать только обычным файлам.

выше командная строка работает с использованием find для вызова (с --exec) явной подоболочкой (bash -c) передавая ему большое количество имен файлов в качестве аргументов ({} +). (_ - это потому, что первый аргумент bash -c script взят как $0, а не $1.) Сценарий, предоставленный bash -c, просто прокручивает его аргументы, используя удобную функцию doit (которую вы можете легко переопределить, если вы хотите использовать эту идею с другая команда.)

Возможно, вам действительно не понадобилось find, потому что вы действительно не заботитесь о рекурсивном сопоставлении, и в этом случае вы могли бы немного упростить это. Кроме того, с bash 4 вы можете использовать ** для рекурсивного globbing, хотя ** также будет соответствовать подкаталогам, поэтому вам нужно будет отфильтровать их.

Вот Баш 4 примера:

doit() { curl -u someone:password ftp://somehost/tmp/ -vT; } 
shopt -s globstar 
sleep= 
for f in **; do if [[ -f $f ]]; then 
    $sleep 
    doit "$f" 
    sleep="sleep 2" 
fi done 

Примечание:

  1. К сожалению, максимальное количество файлов зависят от системы, и зависит от объема памяти, доступного для аргументов и окружающей среды переменных (и, следовательно, от общего размера переменных среды). В моей системе (Ubuntu) максимум составляет около 128 килобайт имени файла, что, вероятно, составляет несколько тысяч файлов, если вы не используете очень длинные имена файлов. Если вы превысите этот предел, вызов bash -c будет выполнен более одного раза, и перед вторым и последующим вызовами не будет сна, а это означает, что один файл каждые несколько тысяч будет загружен без предварительного сна. С другой стороны, спящие в течение 2000 файлов складываются более чем на час, поэтому я не думаю, что это очень вероятно, что это ограничение применяется.
0

Если у вас есть GNU Parallel вы можете запустить:

ssh [email protected] "cd /export/home/someone && find . -name '*' -print | 
    parallel -j1 'sleep 10;curl -u someone:password ftp://somehost/tmp/ -vT' 

Все новые компьютеры имеют несколько ядер, но большинство программ серийный характер и поэтому не будет использовать несколько ядер. Тем не менее, многие задачи чрезвычайно parallelizeable:

  • Выполнить ту же программу на многих файлах
  • Выполнить ту же самую программу для каждой строки в файле
  • Run та же программа для каждого блока в файле

GNU Parallel - это общий параллелизатор и позволяет легко запускать задания параллельно на одном компьютере или на нескольких компьютерах, к которым у вас есть доступ ssh.

Если у вас есть 32 различных заданий, которые вы хотите работать на 4-х процессоров, прямо вперед способ распараллеливания является выполнение 8 заданий на каждом CPU:

Simple scheduling

GNU Parallel вместо порождает новый процесс, когда один заканчивается - поддержание процессоров активным и тем самым экономя время:

GNU Parallel scheduling

Установка

Личная установка не требует доступа root.Это может быть сделано в течение 10 секунд, делая это:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash 

Для других вариантов установки см http://git.savannah.gnu.org/cgit/parallel.git/tree/README

Подробнее

Другие примеры: http://www.gnu.org/software/parallel/man.html

смотреть интро видео: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Прогулка по t он учебник: http://www.gnu.org/software/parallel/parallel_tutorial.html

Зарегистрируйтесь на список адресов электронной почты, чтобы получить поддержку: https://lists.gnu.org/mailman/listinfo/parallel