Ответы:
Эта команда будет печатать файлы с lsofнужным усечением.
(Это на самом деле не удаляет и не усекает файлы).
lsof вернет список открытых файлов (файловых дескрипторов), который передается в awk, который обрабатывает его следующим образом.
gawk '$4~/txt/{next};/REG.*\(deleted\)$/{printf ">/proc/%s/fd/%d\n", $2,$4}'
Вышеупомянутое выражение содержит два регулярных выражения, разделенных точкой с запятой ;
давайте рассмотрим первую часть gawk '$4~/txt/{next};
Здесь, если четвертое поле содержит, txtбудет прочитана следующая строка текста, которую скрипт снова начнет обрабатывать с самого начала.
В nextзаявлении силы AWK немедленно прекратить обработку текущей записи и перейти к следующей записи. Это означает, что дальнейшие правила для текущей записи не выполняются, а остальные действия текущего правила не выполняются.
Теперь давайте рассмотрим вторую часть скрипта /REG.*\(deleted\)$/{printf ">/proc/%s/fd/%d\n", $2,$4}'
Здесь, если строка соответствует регулярному выражению /REG.*\(deleted\)$( $означает, что (deleted)должно быть последнее слово в строке), она просто печатает >/proc/%s/fd/%d\n", $2,$4.
В команде lsof указывается $4номер дескриптора файла (например 53w, wозначает, что файлер был открыт для записи) или тип файла, в зависимости от файла. %dВ printfгарантирует , что только номера будут распечатаны, удаление любых текстовых символов (вроде w). $2печатает идентификатор процесса для процесса, который использует файл, так что он будет печатать что-то подобное, >/proc/3989/fd/53и поэтому он будет печатать все файлы, которые были удалены, но чей дескриптор файла остается открытым, другими словами, дескрипторы файлов, которые можно безопасно обрезать.
Эта команда будет обрезать удаленные файлы из lsof.
Эта первая будет список открытых файловlsof
затем искать строки рекурсивно одну, затем одну {next}, содержащую REG '$4~/txt/{next};/REG.*\(deleted\)$/в качестве четвертого параметра, тогда этот процесс относительно этой строки будет удален
а затем выведите все результаты без строк, содержащих REG и помеченных как удаленные.{printf ">/proc/%s/fd/%d\n", $2,$4}'
shдля фактического усечения, и более того, там есть два регулярных выражения, а не одно, как в вашем объяснении