Xargs передает ввод команде, содержащей канал

2684
Sridhar-Sarnobat

В качестве средства, чтобы понять, как управлять приоритетом привязки с помощью каналов, я пытаюсь напечатать путь одного файла на каталог - для каждого каталога:

find $PWD -type d | xargs --delimiter "\n" -I% -n 1 (find % -maxdepth 1 | head -1) 

Я получаю no matches found: (find % -maxdepth 1 | head -1). Без скобок я бы получил, xargs: find: terminated by signal 13поэтому я уверен, что нам нужно как-то сделать каналы правильно ассоциативными.

Как передать ввод xargs команде, содержащей каналы? (пожалуйста, не говорите мне использовать -exec, я хочу узнать, как манипулировать приоритетом привязки для других проблем).

2

3 ответа на вопрос

2
Ipor Sircer

Вот вы с xargs:

find . -type d|xargs -I % sh -c 'find % -type f -maxdepth 1 | head -1' 

Но помните: внутренний цикл намного быстрее!

time find $PWD -type d | while read dir;do find $dir -type f -maxdepth 1 | head -1;done >/dev/null  0m09.62s real 0m01.67s user 0m02.36s system time find . -type d|xargs -I % sh -c 'find % -type f -maxdepth 1 | head -1' >/dev/null  0m12.85s real 0m01.84s user 0m02.86s system 
Интересно. Опять же, я хочу узнать, как правильно манипулировать ассоциативностью каналов (если это вообще возможно). Я думал, что создание подоболочки в фигурных скобках поможет, но, очевидно, нет. Sridhar-Sarnobat 8 лет назад 0
У вас нет другого решения с xargs. Посмотрите на: http://stackoverflow.com/questions/6958689/xargs-with-multiple-commands-as-argument Ipor Sircer 8 лет назад 1
О, вот почему ты не любишь xargs. Или, по крайней мере, именно поэтому ты превращаешь меня в ненавистника ксаргов :) Все, что выбрасывает мощь оболочки, - это мгновенное решение. Sridhar-Sarnobat 8 лет назад 0
0
Ipor Sircer

Лично я не люблю Xargs

find $PWD -type d | while read dir;do find $dir -type f -maxdepth 1 | head -1;done 
Приятно знать, что есть альтернатива. Хотя я ненавижу петли;) Sridhar-Sarnobat 8 лет назад 0
Вы будете _love_ петли в ближайшее время! ; -> Ipor Sircer 8 лет назад 0
Даже если я активист функционального программирования? При написании кода Java я стараюсь избегать циклов любой ценой. Но пока циклы делают только одно, это приемлемо, хотя и многословно :( Sridhar-Sarnobat 8 лет назад 0
0
Ipor Sircer

И это самое быстрое решение со всем внутренним:

time find . -type d | while read dir;do for file in "$dir"/*;do if [ -f "$file" ]; then realpath $file;break;fi;done;done >/dev/null 0m00.21s real 0m00.08s user 0m00.10s system 

Непревзойденная скорость в скорлупе. (Я сказал, что не люблю xargs)