LinuxForum.Fans
Тема

Доступ к параметрам xargs

Автор: valet 12 сообщений 1612 просмотров
#279428

Есть просто гигантский набор файлов, который надо обработать sed-скриптом.
Обычным методом не получается - выдает сообщение о слишком длинном списке аргументов.
Поэтому решил использовать xargs, но не могу разобраться как передать имя файла.

Есть папка in, где лежит 100500 файлов, которые надо обработать sed-скриптом script и выложить в папку out
Погуглив я делаю так:

text
find in/ -type f | xargs ./script {} > out/{}

Но при этом все сливается в один файл out/{} - я как бы понимаю, что во вторые {} не передается имя файла, но как тогда передать?

Помогите разобраться.

#279431

А если так:

text

#!/bin/bash

cd in for file in $(find . -type f) ; do /path/to/your/script $file > $file.out done

Причем, можно и не делать скрипт, а записать все это в виде однострока:

text

cd in ; for file in $(find . -type f) ; do /path/to/your/script $file > $file.out; done

В результате мы получим файлы с именами вида abc.out, abcdef.out и т.д.

#279435

"yars" написал:
В результате мы получим файлы с именами вида abc.out, abcdef.out и т.д.
вроде бы работает, но мне ж так не надо - мне надо положить результующие файлы с теми же именами в другой каталог.
#279436

Разобрался, все ок.
Спасибо, работает.

#279570

И все таки не против узнать как это сделать через xargs. Он вообще более чем полезен, так как позволяет организовать многопоточную работу.

#279638

по идее можно скопировать в отдельный каталог и
find in/ -type f | xargs ./script -i
с обычным «sed'ом из командной строки» это сработало бы
или так:
find in/ -type f | xargs sed -f ./script -i
-rn добавляются по необходимости

#279731
"valet" написал:
И все таки не против узнать как это сделать через xargs. Он вообще более чем полезен, так как позволяет организовать многопоточную работу.
сколько у вас накопителей?..

"valet" написал:
выложить в папку out

как вы умудрились сделать многопоточную папку? :)

#279732
"Fat-Zer" написал:
find in/ -type f | xargs ./script -i

расскажите, зачем здесь xargs?

text
find in -type f -exec ./script -i {} +
#280034

"drBatty" написал:
сколько у вас накопителей?..
Как разница сколько? А даже если 1 то что? Вы что сомневаетесь, что даже с одним накопителем возможна многопоточность?

"drBatty" написал:
как вы умудрились сделать многопоточную папку?
В смысле? Каталог один, но в него можно выкладывать данные многопоточно :)

"drBatty" написал:
расскажите, зачем здесь xargs?
ну кокретно этот пример не совсем удачный, так например find in/ -type f | xargs -P 10 ./script -i более очевидно.
-P 10 - работаем в 10 потоков. Это и есть причина использования xargs, другими методами этого по человечески не реализовать.

"drBatty" написал:
find in -type f -exec ./script -i {} +
не пробовал, но где тут хоть намек на папку out, в которую должны выложится данные.
#280067
"valet" написал:
Как разница сколько? А даже если 1 то что? Вы что сомневаетесь, что даже с одним накопителем возможна многопоточность?

нет. не сомневаюсь. Мало того, как всем здесь прекрасно известно, в начале 90х я служил в стройбате, и прекрасно знаю, почему и зачем нужно заставить молодого солдата копать две траншеи одновременно - чем бы солдат не занимался, лишь-бы...

"valet" написал:
В смысле? Каталог один, но в него можно выкладывать данные многопоточно

см. выше.
и да, операция модификации каталога атомарна, потому "многопоточно выкладывать в папку" принципиально не возможно. Ну во всяком случае в Linux.

"valet" написал:
ну кокретно этот пример не совсем удачный, так например find in/ -type f | xargs -P 10 ./script -i более очевидно.
-P 10 - работаем в 10 потоков. Это и есть причина использования xargs, другими методами этого по человечески не реализовать.

это тоже не по человечески. Не сомневаюсь, что такой код будет работать примерно в 10..100 раз медленнее, и породит настолько жуткую фрагментацию, что читать эти файлы будет просто невозможно. Как раз тот случай, когда сдуру можно * сломать.

"valet" написал:
не пробовал, но где тут хоть намек на папку out, в которую должны выложится данные.

очевидно, в ключе --in-place.

ЗЫЖ Возвращаясь к СА: что-бы командовать землекопами надо сначала научиться самому копать. Подумайте об этом. Компьютер он же как солдат - что ему прикажешь, то он и сделает, ДОСЛОВНО. Если _вы_ отдали идиотский приказ - компьютер его выполнит беспрекословно - его не волнует результат.

#280244

drBatty, вы уверены в том, о чем говорите?

Как тогда объяснить следующее:

text
root@debian:/test# ls in | wc -l
25766
root@debian:/test# date; find in -type f -exec ./script -i {} +; date
Tue Oct 16 21:17:19 MSK 2012
Tue Oct 16 21:21:52 MSK 2012
root@debian:/test# date; find in -type f|xargs -P10 ./script -i; date
Tue Oct 16 21:26:20 MSK 2012
Tue Oct 16 21:27:54 MSK 2012
root@debian:/test# date; find in -type f -exec ./script -i {} +; date
Tue Oct 16 21:30:14 MSK 2012
Tue Oct 16 21:34:32 MSK 2012
root@debian:/test# date; find in -type f|xargs -P10 ./script -i; date
Tue Oct 16 21:36:08 MSK 2012
Tue Oct 16 21:38:01 MSK 2012

1-ый тест в 1 поток: 273 секунды
2-ой тест в 10 потоков: 94 секунды, то есть почти в 3 раза быстрее
3-ий тест снова в 1 поток: 318 секунд
4-ый тест в 10 потоков: 113 секунд, что снова почти в 3 раза быстрее.

Подозреваю, что если файлов было бы в раз 10 больше выигрыш был бы еще более ощутимым.

Так что ваша версия про атомарность операций как минимум сомнительна.

"drBatty" написал:
Не сомневаюсь, что такой код будет работать примерно в 10..100 раз медленнее,
но как видите, он работает в 3 раза быстрее :) - проверьте еще у себя, если не верите мне.
"drBatty" написал:
породит настолько жуткую фрагментацию
и с чего бы это? Насколько я понимаю, если между этими потоками не будет других дисковых операций файлы на диск будут складываться также плотно как они бы складывались в 1 поток.
#282360

Эх, так никто и не подсказал, а все просто на самом деле, опция xargs -i все решает.

The -i argument to xargs says fill in all the {} expressions on the right hand side of the pipe with all the values being generated on the left hand side of the pipe
Войдите или зарегистрируйтесь, чтобы ответить.