У меня есть несколько задач cron,каждый из которых оставляет отдельный файл журнала. Успешные задачи не производят никаких результатов, поэтому я получаю много пустых журналов.
Я бы хотел автоматически очищать их каждый день. Запросить find
для поиска size = 0 легко, однако я хотел бы убедиться, что я не удаляю журнал, который был только что создан запущенной задачей, но еще не закрыт.
Is есть способ указать find
пропускать открытые файлы, или мне нужно прибегнуть к lsof
?
Согласно моему знанию нет никакого простого способа сделать это с находкой.
Решение Одно
Генерируют список открытых файлов в целевой папке 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' команда.