Интересной частью этого вопроса является получение сна между кудрями, а не в начале или в конце последовательности завитушек.
Если вы не слишком много файлов, для некоторого значения «слишком много» [Примечание 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
Примечание:
- К сожалению, максимальное количество файлов зависят от системы, и зависит от объема памяти, доступного для аргументов и окружающей среды переменных (и, следовательно, от общего размера переменных среды). В моей системе (Ubuntu) максимум составляет около 128 килобайт имени файла, что, вероятно, составляет несколько тысяч файлов, если вы не используете очень длинные имена файлов. Если вы превысите этот предел, вызов
bash -c
будет выполнен более одного раза, и перед вторым и последующим вызовами не будет сна, а это означает, что один файл каждые несколько тысяч будет загружен без предварительного сна. С другой стороны, спящие в течение 2000 файлов складываются более чем на час, поэтому я не думаю, что это очень вероятно, что это ограничение применяется.
вы можете не только сделать 'первой команды; сон 10; вторая команда 'или' первая команда && sleep 10 | вторая команда', если вам нужно трубить? – 2014-09-19 14:55:32
Зачем вам нужен сон? Кроме того, это похоже на 'find/export/home/someone -exec curl -u кто-то: password -vT {} ftp: // somehost/tmp /' будет работать. – chepner
Если вы используете 'bash' 4, вам даже не нужно' find': 'shopt -s globstar; curl -u кто-то: пароль -vT/export/home/someone/**/* ' – chepner