Предположим, это мои файлы:
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 Я запустил его только сейчас (11 июля).
поэтому удаление файлов за 11 июля кажется правильным. они не «вчера»
@jhnc да, но есть некоторые проблемы. 1) Файл от 9 июля есть ls -lh
. 2) Там не все файлы от 10 июля.
да, это проблема с определением -mtime 1
, которое я поднял в комментариях к ответу - это означает временной интервал >=86400 секунд назад и <2*86400 секунд назад
если вы используете GNU find, простое решение — указать опцию -daystart
, чтобы расчеты выполнялись с полуночи до полуночи, а не текущего времени.
Да, ты прав. Я думаю использовать stat
и создать переменную типа yesterday=$(date ...)
, затем, если дата создания не вчера, удалите ее. Я вернусь как можно скорее, я найду это
@jhnc Я отредактировал update2
с решением (возможно), но оно пока не работает :(
поскольку у вас, похоже, есть утилиты GNU, вы можете попробовать: find . -daystart -type f ! -mtime 1 -ls
(и без !
), чтобы увидеть, что они дают нужные вам варианты выбора
@jhnc кажется, что без !
показывает исключенный результат, а с !
удаляет все файлы, которые не относятся к вчерашнему дню. Спасибо. Пожалуйста, напишите это как ответ, если можете.
Я собираюсь удалить все файлы, кроме файлов, дата создания которых — вчерашний день.
Это будет соответствовать всем файлам, кроме тех, которые были созданы вчера.
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 Разве дробная часть не игнорируется? Боже, расчеты времени find
просто сумасшедшие. find . -type f -printf '%CF %p\n' | grep ^2024-07-09
немного проще, но избавляет от необходимости анализировать выходные данные.
Я планировал использовать -newer
с двумя файлами, созданными с соответствующими временными метками touch
, но потом понял, что не знаю, как портативно вычислить дату для «вчера» :-) Если нас это не волнует, в GNU find есть -daystart
и т. д.
@jhnc Я с нетерпением жду твоей версии. :-) Теперь пора ложиться спать.
Стандартный 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.
какая дата/время, когда вы запускали команды?