В общих случаях, будь то общедоступные компьютеры или компьютеры без безопасного соединения, такие как более или менее захватывающие интернет-соединения от других пользователей в соседних портах (т. е. дома / квартиры по соседству), то это одно - я думаю - даст пример того, как брандмауэр (по усмотрению) мог бы стать лучшей частью доблести, так сказать. Кроме того, они заставляют тех, кто вас окружает, копаться в вашей информации, будь то личная или даже просто глупость, с которой вы можете столкнуться. Дело в конфиденциальности.
Когда я говорю вообще, опять же, я имею в виду такие места, как общественные места. Библиотеки, в которых все и вся, прежде чем использовать переносные носители, такие как USB, на самом деле, диски, даже если вы должны были сделать что-то, что может быть опрометчиво, например, взять собственный внешний жесткий диск в другом месте и подключить его, нет гарантии, что последующий порт защищенных антивирусными или шпионскими программаторами, и все это может защелкнуться и вернуться обратно к вашему оригинальному домашнему ноутбуку / рабочему столу, тем самым сделав себя дома.
Так что, хотя может и не быть яростной потребности в много случаев для брандмауэра для защиты от множества вещей, они, безусловно, пригождаются против определенных - если изолированы - случаи.
Мой основной подход такой же, как и в ответе 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)); }'
Поскольку выход имеет нулевое значение,
Если вы подтвердили, что хотите удалить перечисленные файлы, вы можете передать список:
xargs -r0 -- rm --
Вот простой скрипт для этого:
#!/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 файлов, старый или нет.
Итак, мы хотим получить (обычные) файлы с 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)
Мой основной подход такой же, как и в ответе 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)); }'
Поскольку выход имеет нулевое значение,
Если вы подтвердили, что хотите удалить перечисленные файлы, вы можете передать список:
xargs -r0 -- rm --
Вот простой скрипт для этого:
#!/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 файлов, старый или нет.
Итак, мы хотим получить (обычные) файлы с 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)