Удалить файлы без данных и только заголовок

LimitNProc=является rlimit (, их также называют ulimit ). "См. setrlimit (2 )для получения подробной информации об ограничении ресурсов. Концепция... Обратите внимание, что большинство ограничений ресурсов процесса, настроенных с помощью этих опции для каждого процесса -, и процессы могут разветвляться, чтобы получить новый набор ресурсов, которые учитываются независимо от исходный процесс и, таким образом, может выйти за установленные ограничения». Это задокументировано в man systemd.exec. RLIMIT_NPROCявляется одним из исключений из этой цитаты; оно ограничивает количество процессов «для реального идентификатора пользователя» (UID ). ].

TasksMax=задокументировано в более конкретном man systemd.resource-control,как один из вариантов, который «опирается на Linux Control Groups (cgroups )концепция ядра для организации процессов». Все такие ограничения применяются к cgroup, созданной для службы systemd. cgroups нельзя избежать, просто разветвив новый процесс.

TasksMax=имеет гораздо больше смысла для меня. Я не знаю причин, по которым вы могли бы использовать LimitNProc=.

2
28.04.2020, 23:14
1 ответ

Чтобы не читать файлы целиком (, как это делает wc), когда после первой строки вы знаете, что в файле как минимум 2 строки, я бы сделал (в системе GNU.):

LC_ALL=C gawk -v ORS='\0' '
  FNR == 2 {nextfile}
  ENDFILE  {if (FNR < 2) print FILENAME}' /path/File_* |
  xargs -r0 rm -f

Это также более эффективно, так как сводит к минимуму количество выполняемых команд.

Более надежен, так как работает с произвольными именами файлов.

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

Этот возвращает ненулевой -статус выхода только в том случае, если файл не может быть удален (и был там с самого начала ).


Ваша проблема в том, что статус выхода этой линии конвейера является статусом выхода правой -самой команды в ней (, если вы не используете опцию pipefail).

Самая правая -команда здесь — цикл while. Статус выхода из цикла соответствует последнему выполнению команды в теле цикла. В вашем случае это будет команда [ "$FN" != total ], запускаемая в последней строке ввода, которая будет не -нулем, если только не будет только одного /path/File_*файла (, и в этом случае wcне будет вывести общее количество ).

Если вы изменили его на:

[ "$CNT" -gt 1 ] || [ "$FN" = total ] || rm -f -- "$FN"

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

2
19.03.2021, 02:20

Теги

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