Как `найти` файлы, которые не открываются никаким процессом

У меня есть несколько задач cron,каждый из которых оставляет отдельный файл журнала. Успешные задачи не производят никаких результатов, поэтому я получаю много пустых журналов.

Я бы хотел автоматически очищать их каждый день. Запросить find для поиска size = 0 легко, однако я хотел бы убедиться, что я не удаляю журнал, который был только что создан запущенной задачей, но еще не закрыт.

Is есть способ указать find пропускать открытые файлы, или мне нужно прибегнуть к lsof ?

0
задан 20 November 2019 в 18:55
1 ответ

Согласно моему знанию нет никакого простого способа сделать это с находкой.

Решение Одно

Генерируют список открытых файлов в целевой папке lsof.lst. и генерируйте список находки той папки. затем дисплейные файлы в find.lst, которые не находятся в эти lsof.lst список.

для генерации lsof.lst используют следующую команду:

lsof +D folderName | awk '{ if(NR>1)print $9 }' | sort | uniq > lsof.lst

и затем следующая команда для показа файлов не в настоящее время открываются в той же папке:

find folderName | grep -v -f lsof.ls

Решение Два

Вы могли также сделать это сразу как это:

find folderName | grep -v -E `lsof +D folderName | awk '{ if(NR>1)print $9 }' | sort | uniq | awk '{print [112]}' ORS='|' | sed 's/.$//'`

Объяснение

Теперь я попытаюсь объяснить команду так, чтобы можно было улучшить его или изменить его или использовать несколько инструментов командной строки в будущем.

find folderName генерирует список всех файлов в той папке и подпапках. вывод команды находки передается по каналу к grep, который здесь используется с эти -v переключатель для исключения объектов, упомянутых в эти -E параметры от переданного по каналу вывода команды находки. Результатом будет вывод [1 110] минус объекты, упомянутые в -E параметр.

прием здесь должен генерировать список открытых файлов и поместить его в формат, который grep -v -E ожидает и может работать с. grep-E берет список строк, разделенных '|'.

lsof +D FolderName генерирует список открытых файлов в той папке, но список включает заголовок и много столбцов, один из которых является именем файла, и это могло содержать дубликаты. Таким образом, мы используем awk '{ if(NR>1)print $9 }', чтобы сделать две вещи, удалить первую строку с [1 115] и распечатать только столбец, содержащий имя файла, которое является с [1 116]. Результатом является список имен файлов открытых файлов в той папке без заголовка.

Для удаления дубликатов вывод передается по каналу к [1 117] и затем uniq, и следующая команда awk '{print [1119]}' ORS='|' превращает список в предложение, разделенное '| ', и последняя команда удаляет последнее '|', поскольку это чрезмерно.

включение, которые управляют с одинарными левыми кавычками' ' executes that command in that spot and feeds the output to the grep-v-E' команда.

1
ответ дан 4 December 2019 в 15:34

Теги

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