1

Я получаю сообщения об ошибках сломанной трубы от команды, которая делает что-то вроде:

ls -tr1 /a/path | awk -F '\n' -vpath=/prepend/path/ '{print path$1}' | head -n 50

По сути, я хочу перечислить (с абсолютным путем) самые старые файлы X в каталоге.

Кажется, что происходит то, что вывод правильный (я получаю 50 путей к файлам), но когда head выдает 50 файлов, он закрывает stdin, заставляя awk выдавать ошибку сломанного канала, поскольку он все еще выводит больше строк.

1 ответ1

0

Решение от ОП, редакция 2


Оказывается, я был довольно глупым.

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

Во-вторых, вместо обратной сортировки с помощью ls мы можем выполнить стандартную сортировку по времени и использовать tail для извлечения строк, которые нам нужны. Это гарантирует, что труба остается открытой в течение всего процесса.

Новая команда будет выглядеть так:

ls -t1 /a/path | tail -n 50 | awk -F '\n' -vpath=/prepend/path/ '{print path$1}'

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