Как решить ошибку "Broken Pipe" при использовании awk с головой

2242
Jon

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

ls -tr1 /a/path | awk -F '\n' -vpath=/prepend/path/ '' | head -n 50 

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

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

1
Пожалуйста, ответьте на свой вопрос, используя кнопку ** ответить на вопрос ** ниже, как только сможете! Тогда вы даже можете получить репутацию и принять это. slhck 12 лет назад 0
Я хотел бы, но как новый пользователь я не могу сделать это в течение другого ... 5 часов очевидно. Я хотел записать ответ, чтобы не забыть. Jon 12 лет назад 0

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

0
slhck

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


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

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

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

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

ls -t1 /a/path | tail -n 50 | awk -F '\n' -vpath=/prepend/path/ '' 

Похожие вопросы