Xargs: ls: завершается сигналом 13

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

find "/var/www/site1/" -maxdepth 1 -type f | xargs ls -1S | head -n 4 | xargs -d '\n' rm -f

Он отлично работает, но время от времени выдает ошибку обрыва трубы:

xargs: ls: terminated by signal 13

Ответы

Ответ 1

Я столкнулся с подобной проблемой и нашел этот поток для поиска ответа:

Сигнал 13 означает, что что-то записывается в канал, где ничего не читается больше (например, см. http://people.cs.pitt.edu/~alanjawi/cs449/code/shell/UnixSignals.htm).

Дело здесь в том, что команда ls, выполняемая xargs, все еще записывает выходные данные, когда следующая команда главы уже получила все необходимые ей данные и закрыла входной канал. Таким образом, безопасно игнорировать, но это уродливо. См. Также принятый ответ в https://superuser.com/questions/554855/how-can-i-fix-a-broken-pipe-error

Ответ 2

Вы намеренно завершаете свою программу с помощью head -n 4, которая создает разбитый канал, потому что вы завершили его до завершения "вызывающего". Так как это ожидается от вас, вы можете проигнорировать ошибку, перенаправив ее на /dev/null, которая отбрасывает ее:

find "/var/www/site1/" -maxdepth 1 -type f | xargs ls -1S | head -n 4 | xargs -d '\n' rm -f 2>/dev/null