Удалите файлы в каталоге старше 7 дней, но всегда оставляйте не менее 20 файлов

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

Когда я говорю вообще, опять же, я имею в виду такие места, как общественные места. Библиотеки, в которых все и вся, прежде чем использовать переносные носители, такие как USB, на самом деле, диски, даже если вы должны были сделать что-то, что может быть опрометчиво, например, взять собственный внешний жесткий диск в другом месте и подключить его, нет гарантии, что последующий порт защищенных антивирусными или шпионскими программаторами, и все это может защелкнуться и вернуться обратно к вашему оригинальному домашнему ноутбуку / рабочему столу, тем самым сделав себя дома.

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

0
задан 7 July 2017 в 21:57

6 ответов

Мой основной подход такой же, как и в ответе steeldriver, но я собираюсь немного упростить его. Следующие команды распечатывают список файлов в recentpicturesdirectory, опуская младший retain_count (20) и все младше retain_younger_days дней (7).

find recentpicturesdirectory -type f -printf '%T@ %p\0' | sort --zero-terminated --reverse --numeric-sort --field-separator=' ' --key 1,1 | gawk -F ' ' -v RS='\0' -v ORS='\0' -v retain_count=20 -v retain_younger_days=7 \ 'BEGIN{ maxage = systime() - retain_younger_days * 24 * 3600; } (NR > retain_count) && (int($1) < maxage) { print(substr($0, length($1) + 2)); }'

Поскольку выход имеет нулевое значение,

Объяснение

find recentpicturesdirectory -type f -printf '%T@ %p\0' Выберите вложенные записи в recentpicturesdirectory, которые являются обычными файлами (-type -f) и напечатать последнее время и путь модификации, завершаемый нулевым символом (-printf '%T@ %p\0'). sort --zero-terminated --reverse --numeric-sort --field-separator=' ' --key 1,1 Сортировка записей, завершенных нулевым символом (-z / --zero-terminated) на основе первого поля (-k / --key 1,1) с разделителем полей пробела (-t / --field-separator=' '), интерпретируемым как десятичные числа (-n / --numeric-sort) в порядке убывания (-r / --reverse). gawk -F ' ' -v RS='\0' -v ORS='\0' -v retain_count=20 -v retain_younger_days=7 Запустите программу GNU AWK с разделителем полей пробела (-F ' '), разделителем выходной записи и вывода нулевого символа (-v RS='\0' -v ORS='\0'), а переменные retain_count и retain_younger_days установлены на 20 и 7 соответственно. BEGIN{ maxage = systime() - retain_younger_days * 24 * 3600; } В начале программы установите maxage на текущее системное время в секундах минус значение retain_younger_days, преобразованное из дней в секунды. (NR > retain_count) && (int($1) < maxage) Выберите номера записей выше retain_count и значение в первом столбце ниже maxage. print(substr($0, length($1) + 2)) Распечатайте текущую запись, опуская первое поле и последующий разделитель полей, i. е. имя пути после времени модификации.

Как удалить отпечатанные файлы

Если вы подтвердили, что хотите удалить перечисленные файлы, вы можете передать список:

xargs -r0 -- rm --
0
ответ дан 18 July 2018 в 10:35

Вот простой скрипт для этого:

#!/bin/bash IMGSPATH="/path/to/somewhere" # count of all files within your directory count=$(find $IMGSPATH -type f | wc -l) # remove the ones older than of 7 days while [ "$count" -gt "20" ] do find $IMGSPATH -type f -mtime +7 -print -delete -quit count=$((--count)) done Сначала мы подсчитываем все файлы в вашем желаемом каталоге. Хотя количество файлов в этом каталоге больше, чем у «20», выполните следующие действия: найдите первый файл старше, чем «7» дней. Удалить его Уменьшить количество доступных файлов Повторите «# 2» ...

Чтобы проверить это:

mkdir /tmp/lab cd /lab touch {1..40} touch -d "10 days ago" {1..20}

Сохраните сценарий и запустите он для /tmp/lab теперь файлы с 1 по 20 должны быть удалены, запустите:

touch -d "10 days ago" {21..35}

запустите сценарий снова, ничего не будет удалено, потому что у вас не более 20 файлов, старый или нет.

0
ответ дан 18 July 2018 в 10:35

Итак, мы хотим получить (обычные) файлы с mtime более 7 дней назад И не находятся в 20 самых новых файлах.

Один из способов сделать это - создать список файлы вместе со временем их модификации и флагом, указывающим, является ли файл mtime +7 или нет. Затем мы можем отсортировать список по mtime и взять все, кроме 20 самых последних1. И, наконец, итерация по результирующему списку и удаление только тех, которые соответствуют возрастному порогу:

find ./recentpicturesdirectory -type f \( -mtime +7 -printf 'Y\t' -o -printf 'N\t' \) -printf '%A@\t%p\0' | sort -zk2,2 | head -zn -20 | while read -r -d '' flag _ file; do \ case "$flag" in 'Y') echo rm "$file" ;; *) echo "skipping $file (too new)" ;; esac done

Используя \0 завершение и добавив флаг -z к sort и head ( или tail), мы можем обрабатывать любые юридические имена файлов, не задыхаясь от пробелов.

Добавлен echo для целей тестирования; удалите его, как только убедитесь, что нужные искомые файлы выбраны для удаления.

1 Если мы сортируем в порядке возрастания mtime (т.е. от старого к новому), мы можем использовать head -n -20, чтобы выбрать все, кроме последних 20; В качестве альтернативы мы могли бы сортировать в порядке убывания mtime (новое для старого) и использовать tail -n +21

Если у вас есть zsh, вы можете сделать все это с помощью квалификаторов glob, Я думаю:

rm ./recentpicturesdirectory/**/*(.^om[1,20]^m+7)

, где

**/* соответствует рекурсивно (эквивалент bash globstar) (.) соответствует только обычным файлам om[1,20] показывает результаты в порядке возрастания mtime и выберите первые 20 m+7 совпадений только с файлами mtime> 7 дней ^, инвертируйте все, что следует за

, поэтому логика

regular files NOT (in 20 most recent by mtime OR NOT mtime +7 days)

, который (путем применения правил Моргана) эквивалентен

regular files (NOT in 20 most recent by mtime) AND (mtime +7 days)

Сначала пробуйте пробный запуск, например,

print -rl ./recentpicturesdirectory/**/*(.^om[1,20]^m+7)
1
ответ дан 18 July 2018 в 10:35

Мой основной подход такой же, как и в ответе steeldriver, но я собираюсь немного упростить его. Следующие команды распечатывают список файлов в recentpicturesdirectory, опуская младший retain_count (20) и все младше retain_younger_days дней (7).

find recentpicturesdirectory -type f -printf '%T@ %p\0' | sort --zero-terminated --reverse --numeric-sort --field-separator=' ' --key 1,1 | gawk -F ' ' -v RS='\0' -v ORS='\0' -v retain_count=20 -v retain_younger_days=7 \ 'BEGIN{ maxage = systime() - retain_younger_days * 24 * 3600; } (NR > retain_count) && (int($1) < maxage) { print(substr($0, length($1) + 2)); }'

Поскольку выход имеет нулевое значение,

Объяснение

find recentpicturesdirectory -type f -printf '%T@ %p\0' Выберите вложенные записи в recentpicturesdirectory, которые являются обычными файлами (-type -f) и напечатать последнее время и путь модификации, завершаемый нулевым символом (-printf '%T@ %p\0'). sort --zero-terminated --reverse --numeric-sort --field-separator=' ' --key 1,1 Сортировка записей, завершенных нулевым символом (-z / --zero-terminated) на основе первого поля (-k / --key 1,1) с разделителем полей пробела (-t / --field-separator=' '), интерпретируемым как десятичные числа (-n / --numeric-sort) в порядке убывания (-r / --reverse). gawk -F ' ' -v RS='\0' -v ORS='\0' -v retain_count=20 -v retain_younger_days=7 Запустите программу GNU AWK с разделителем полей пробела (-F ' '), разделителем выходной записи и вывода нулевого символа (-v RS='\0' -v ORS='\0'), а переменные retain_count и retain_younger_days установлены на 20 и 7 соответственно. BEGIN{ maxage = systime() - retain_younger_days * 24 * 3600; } В начале программы установите maxage на текущее системное время в секундах минус значение retain_younger_days, преобразованное из дней в секунды. (NR > retain_count) && (int($1) < maxage) Выберите номера записей выше retain_count и значение в первом столбце ниже maxage. print(substr($0, length($1) + 2)) Распечатайте текущую запись, опуская первое поле и последующий разделитель полей, i. е. имя пути после времени модификации.

Как удалить отпечатанные файлы

Если вы подтвердили, что хотите удалить перечисленные файлы, вы можете передать список:

xargs -r0 -- rm --
0
ответ дан 24 July 2018 в 19:36

Вот простой скрипт для этого:

#!/bin/bash IMGSPATH="/path/to/somewhere" # count of all files within your directory count=$(find $IMGSPATH -type f | wc -l) # remove the ones older than of 7 days while [ "$count" -gt "20" ] do find $IMGSPATH -type f -mtime +7 -print -delete -quit count=$((--count)) done Сначала мы подсчитываем все файлы в вашем желаемом каталоге. Хотя количество файлов в этом каталоге больше, чем у «20», выполните следующие действия: найдите первый файл старше, чем «7» дней. Удалить его Уменьшить количество доступных файлов Повторите «# 2» ...

Чтобы проверить это:

mkdir /tmp/lab cd /lab touch {1..40} touch -d "10 days ago" {1..20}

Сохраните сценарий и запустите он для /tmp/lab теперь файлы с 1 по 20 должны быть удалены, запустите:

touch -d "10 days ago" {21..35}

запустите сценарий снова, ничего не будет удалено, потому что у вас не более 20 файлов, старый или нет.

0
ответ дан 24 July 2018 в 19:36

Итак, мы хотим получить (обычные) файлы с mtime более 7 дней назад И не находятся в 20 самых новых файлах.

Один из способов сделать это - создать список файлы вместе со временем их модификации и флагом, указывающим, является ли файл mtime +7 или нет. Затем мы можем отсортировать список по mtime и взять все, кроме 20 самых последних1. И, наконец, итерация по результирующему списку и удаление только тех, которые соответствуют возрастному порогу:

find ./recentpicturesdirectory -type f \( -mtime +7 -printf 'Y\t' -o -printf 'N\t' \) -printf '%A@\t%p\0' | sort -zk2,2 | head -zn -20 | while read -r -d '' flag _ file; do \ case "$flag" in 'Y') echo rm "$file" ;; *) echo "skipping $file (too new)" ;; esac done

Используя \0 завершение и добавив флаг -z к sort и head ( или tail), мы можем обрабатывать любые юридические имена файлов, не задыхаясь от пробелов.

Добавлен echo для целей тестирования; удалите его, как только убедитесь, что нужные искомые файлы выбраны для удаления.

1 Если мы сортируем в порядке возрастания mtime (т.е. от старого к новому), мы можем использовать head -n -20, чтобы выбрать все, кроме последних 20; В качестве альтернативы мы могли бы сортировать в порядке убывания mtime (новое для старого) и использовать tail -n +21

Если у вас есть zsh, вы можете сделать все это с помощью квалификаторов glob, Я думаю:

rm ./recentpicturesdirectory/**/*(.^om[1,20]^m+7)

, где

**/* соответствует рекурсивно (эквивалент bash globstar) (.) соответствует только обычным файлам om[1,20] показывает результаты в порядке возрастания mtime и выберите первые 20 m+7 совпадений только с файлами mtime> 7 дней ^, инвертируйте все, что следует за

, поэтому логика

regular files NOT (in 20 most recent by mtime OR NOT mtime +7 days)

, который (путем применения правил Моргана) эквивалентен

regular files (NOT in 20 most recent by mtime) AND (mtime +7 days)

Сначала пробуйте пробный запуск, например,

print -rl ./recentpicturesdirectory/**/*(.^om[1,20]^m+7)
1
ответ дан 24 July 2018 в 19:36

Другие вопросы по тегам:

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