Как решить ошибку "Broken Pipe" при использовании awk с головой
Я получаю сообщения об ошибках сломанной трубы от команды, которая делает что-то вроде:
ls -tr1 /a/path | awk -F '\n' -vpath=/prepend/path/ '{print path$1}' | head -n 50
По сути, я хочу перечислить (с абсолютным путем) самые старые файлы X в каталоге.
Кажется, что происходит то, что вывод правильный (я получаю 50 путей к файлам), но когда head выдает 50 файлов, он закрывает stdin, заставляя awk выдавать ошибку сломанного канала, так как он все еще выводит больше строк.
1 ответ
Решение от ОП, редакция 2
Оказывается, я был довольно глупым.
Во-первых, не нужно, чтобы awk указывал путь к каждому отдельному файлу, чтобы отбросить большую часть его. Таким образом, оператор awk должен быть последним каналом.
Во-вторых, вместо реверсирования сортировки с помощью ls мы можем выполнить стандартную сортировку по времени и использовать tail для извлечения строк, которые нам нужны. Это гарантирует, что труба остается открытой в течение всего процесса.
Новая команда будет выглядеть так:
ls -t1 /a/path | tail -n 50 | awk -F '\n' -vpath=/prepend/path/ '{print path$1}'