3

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

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 ответа3

2

Вот вы с 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
0

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

find $PWD -type d | while read dir;do find $dir -type f -maxdepth 1 | head -1;done
0

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

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)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .