В качестве средства, чтобы понять, как управлять приоритетом привязки с помощью каналов, я пытаюсь напечатать путь одного файла на каталог - для каждого каталога:
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, я хочу узнать, как манипулировать приоритетом привязки для других проблем).
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)