Как удалить все файлы, кроме файлов последнего дня в Linux?

Предположим, это мои файлы:

file1 ==> 2024/07/10
file2 ==> 2024/07/9
file3 ==> 2024/07/9
file4 ==> 2024/07/8

Я собираюсь удалить все файлы, кроме файлов, дата создания которых — вчера (2024/07/09 — вчера).

Я знаю эту команду find, но я знаю только, как удалять файлы старше N дней, при этом сохраняются файлы сегодняшнего дня и файлы вчерашнего дня:

find . -mtime +2 -delete

Обновление2

Я думаю, что это может быть способ:

yesterday = "$(date -d 'yesterday' '+%Y-%m-%d')"
while read -r file
do
    if [ "$yesterday" != "stat $file -c %y | awk -F ' ' '{print $1}'" ]
    then
        rm -vf "$file"
    fi
done < <(find . -type f)

Я имею в виду: если stat {} -c %y != $yesterday, то удалите файл. Но это удаляет все файлы :(

какая дата/время, когда вы запускали команды?

jhnc 10.07.2024 23:39

@jhnc Я запустил его только сейчас (11 июля).

Saeed 10.07.2024 23:40

поэтому удаление файлов за 11 июля кажется правильным. они не «вчера»

jhnc 10.07.2024 23:41

@jhnc да, но есть некоторые проблемы. 1) Файл от 9 июля есть ls -lh. 2) Там не все файлы от 10 июля.

Saeed 10.07.2024 23:42

да, это проблема с определением -mtime 1, которое я поднял в комментариях к ответу - это означает временной интервал >=86400 секунд назад и <2*86400 секунд назад

jhnc 10.07.2024 23:44

если вы используете GNU find, простое решение — указать опцию -daystart, чтобы расчеты выполнялись с полуночи до полуночи, а не текущего времени.

jhnc 10.07.2024 23:46

Да, ты прав. Я думаю использовать stat и создать переменную типа yesterday=$(date ...), затем, если дата создания не вчера, удалите ее. Я вернусь как можно скорее, я найду это

Saeed 10.07.2024 23:46

@jhnc Я отредактировал update2 с решением (возможно), но оно пока не работает :(

Saeed 11.07.2024 00:05

поскольку у вас, похоже, есть утилиты GNU, вы можете попробовать: find . -daystart -type f ! -mtime 1 -ls (и без !), чтобы увидеть, что они дают нужные вам варианты выбора

jhnc 11.07.2024 00:10

@jhnc кажется, что без ! показывает исключенный результат, а с ! удаляет все файлы, которые не относятся к вчерашнему дню. Спасибо. Пожалуйста, напишите это как ответ, если можете.

Saeed 11.07.2024 00:14
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
10
81
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я собираюсь удалить все файлы, кроме файлов, дата создания которых — вчерашний день.

Это будет соответствовать всем файлам, кроме тех, которые были созданы вчера.

find . -type f ! -mtime 1 -printf '%BF %p\n'  # or %CF
#              ^
#            not Yesterday

Обратите внимание, что файлы, созданные сегодня, будут соответствовать файлам, созданным до вчерашнего дня.

Замените -printf ... на нужное действие, когда убедитесь, что оно соответствует правильным файлам.

выглядит многообещающе! Я зашел в кроличью нору, пытаясь портативно вычислить «вчера», где оно работает с 00:00:00 до 23:59:59, а не между 86400 и 2 * 86400 секундами назад (что и вычисляет -mtime 1)

jhnc 10.07.2024 23:05

@jhnc Разве дробная часть не игнорируется? Боже, расчеты времени find просто сумасшедшие. find . -type f -printf '%CF %p\n' | grep ^2024-07-09 немного проще, но избавляет от необходимости анализировать выходные данные.

Ted Lyngmo 10.07.2024 23:09

Я планировал использовать -newer с двумя файлами, созданными с соответствующими временными метками touch, но потом понял, что не знаю, как портативно вычислить дату для «вчера» :-) Если нас это не волнует, в GNU find есть -daystart и т. д.

jhnc 10.07.2024 23:14

@jhnc Я с нетерпением жду твоей версии. :-) Теперь пора ложиться спать.

Ted Lyngmo 10.07.2024 23:15
Ответ принят как подходящий

Стандартный find использует интервалы в 86 400 секунд с момента запуска программы для вычисления n в -mtime n / -mtime +n / -mtime -n.

Похоже, вопрос ищет интервалы на основе календарной даты.

Мне не очевидно, как это сделать портативно простым способом. Однако, если GNU find доступен, у него есть опция -daystart, которая позволяет сделать именно это:

Файлы, которые нужно сохранить:

find . -daystart -type f -mtime 1 -print

Файлы для удаления:

find . -daystart -type f ! -mtime 1 -print

Обратите внимание, что -mtime проверяет метку времени последней модификации, а не создания файла. Скорее всего, это разные вещи. Не существует стандартной find опции для проверки отметки времени создания файла (и файловые системы могут ее не хранить). Однако в GNU find есть опция, которая может помочь -newerBt:

-newerXY reference
      Succeeds if timestamp X of the file being  considered  is  newer
      than timestamp Y of the file reference.  The letters X and Y can
      be any of the following letters:

      a   The access time of the file reference
      B   The birth time of the file reference
      c   The inode status change time of reference
      m   The modification time of the file reference
      t   reference is interpreted directly as a time

      Some combinations are invalid; for example, it is invalid for  X
      to  be t.  Some combinations are not implemented on all systems;
      for example B is not supported on all systems.  If an invalid or
      unsupported  combination  of  XY is specified, a fatal error re‐
      sults.  Time specifications are interpreted as for the  argument
      to  the -d option of GNU date.  If you try to use the birth time
      of a reference file, and the birth time cannot be determined,  a
      fatal error message results.  If you specify a test which refers
      to the birth time of files being examined, this test  will  fail
      for any files where the birth time is unknown.

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