Поиск файлов в терминале между диапазоном дат
Я использую AIX через telnet здесь на работе, и я хотел бы знать, как найти файлы в определенной папке между диапазоном данных, например: Я хочу найти все файлы в папке X, которые были созданы между 01- Авг-13 и 31 августа-13.
замечания:
- Трюк TOUCH (где вы создаете 2 пустых файла для использования опции -newer) не работает для меня, как только роли пользователя, которые у меня есть на сервере, не позволяют мне создавать файлы.
- Мне нужно найти определенные даты, а не дни (например: файлы, созданные более 30 дней назад и т.д.).
Спасибо заранее!
Ответы
Ответ 1
Вы можете использовать ниже, чтобы найти то, что вам нужно.
Найти файлы старше определенной даты/времени:
find ~/ -mtime $(echo $(date +%s) - $(date +%s -d"Dec 31, 2009 23:59:59") | bc -l | awk '{print $1 / 86400}' | bc -l)
Или вы можете найти файлы между двумя датами. Первая дата более поздняя, последняя дата, старше. Вы можете перейти ко второму, и вам не нужно использовать mtime. Вы можете использовать все, что вам нужно.
find . -mtime $(date +%s -d"Aug 10, 2013 23:59:59") -mtime $(date +%s -d"Aug 1, 2013 23:59:59")
Ответ 2
Если вы используете GNU find
, начиная с версии 4.3.3, вы можете:
find -newerct "1 Aug 2013" ! -newerct "1 Sep 2013" -ls
Он примет любую строку даты, принятую GNU date -d
.
Вы можете изменить c
в -newerct
на любые из a
, B
, c
или m
для просмотра atime/birth/ctime/mtime.
Другой пример - файлы списка, измененные с 17:30 до 22:00 6 ноября 2017 года:
find -newermt "2017-11-06 17:30:00" ! -newermt "2017-11-06 22:00:00" -ls
Подробная информация от man find
:
-newerXY reference
Compares the timestamp of the current file with reference. The reference argument is normally the name of a file (and one of its timestamps is used
for the comparison) but it may also be a string describing an absolute time. X and Y are placeholders for other letters, and these letters select
which time belonging to how reference is used for the comparison.
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 results. 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.
Ответ 3
Попробуйте следующее:
find /var/tmp -mtime +2 -a -mtime -8 -ls
чтобы найти файлы старше 2 дней, но не старше 8 дней.
Ответ 4
Некоторые хорошие решения здесь. Хотел разделить мой, а также короткий и простой.
Я использую find (GNU findutils) 4.5.11
$ find search/path/ -newermt 20130801 \! -newermt 20130831
Ответ 5
Используйте stat
, чтобы получить время создания. Вы можете сравнить время в формате YYYY-MM-DD HH:MM:SS
лексикографически.
Эта работа с Linux с временем модификации, временем создания не поддерживается. В AIX параметр -c
может не поддерживаться, но вы все равно сможете получить информацию, используя grep
, если ничего не работает.
#! /bin/bash
from='2013-08-01 00:00:00.0000000000' # 01-Aug-13
to='2013-08-31 23:59:59.9999999999' # 31-Aug-13
for file in * ; do
modified=$( stat -c%y "$file" )
if [[ $from < $modified && $modified < $to ]] ; then
echo "$file"
fi
done
Ответ 6
Script oldfiles
Я попытался ответить на этот вопрос более полно, и в итоге я создал полный script с параметрами, которые помогут вам понять команду find
.
script oldfiles
находится в этом репозитории
Чтобы создать новую команду find, вы запустите ее с опцией -n
(dry-run), и она вернет вам правильную команду find
, которую вы должны использовать.
Конечно, если вы опустите -n
, он просто запустится, не нужно повторно указывать команду find
.
Использование:
$ oldfiles [-v...] ([-h|-V|-n] | {[(-a|-u) | (-m|-t) | -c] (-i | -d | -o| -y | -g) N (-\> | -\< | -\=) [-p "pat"]})
- Если параметры классифицируются в следующих группах:
- Справка и информация:
-h, --help: показать эту помощь.
-V, --version: Показать версию.
-v, --verbose: включить подробный режим (кумулятивный).
-n, --dry-run: не запускать, просто объясните, как создать команду "find"
- Тип времени (доступ/использование, время модификации или измененный статус):
-a или -u: время доступа (использование)
-m или -t: время модификации (по умолчанию)
-c: изменение статуса inode
- Диапазон времени (где N - положительное целое число):
-i N: минуты (по умолчанию, N равно 1 мин)
-d N: дни
-o N: месяцев
-y N: лет
-g N: N - ДАТА (пример: "2017-07-06 22:17:15" )
- Тесты:
-p "pat": необязательный шаблон для соответствия (пример: -p "*.c" для поиска c файлов) (по умолчанию -p "*" )
- \ > : файл более новый, чем заданный диапазон, т.е. время, измененное после него.
-\<: файл старше заданного диапазона, т.е. время до него. (По умолчанию)
-\=: файл, который точно равен N (мин., день, месяц, год).
Пример:
- Найти исходные файлы C более чем за 10 минут (время доступа) (с подробностью 3):
$ oldfiles -a -i 10 -p"*.c" -\> -nvvv
Starting oldfiles script, by beco, version 20170706.202054...
$ oldfiles -vvv -a -i 10 -p "*.c" -\> -n
Looking for "*.c" files with (a)ccess time newer than 10 minute(s)
find . -name "*.c" -type f -amin -10 -exec ls -ltu --time-style=long-iso {} +
Dry-run
- Найти файлы заголовков H старше месяца (время модификации) (многословность 2):
$ oldfiles -m -o 1 -p"*.h" -\< -nvv
Starting oldfiles script, by beco, version 20170706.202054...
$ oldfiles -vv -m -o 1 -p "*.h" -\< -n
find . -name "*.h" -type f -mtime +30 -exec ls -lt --time-style=long-iso {} +
Dry-run
- Найти все (*) файлы за один день (1 декабря 2016 года, без многословия, сухая работа):
$ oldfiles -mng "2016-12-01" -\=
find . -name "*" -type f -newermt "2016-11-30 23:59:59" ! -newermt "2016-12-01 23:59:59" -exec ls -lt --time-style=long-iso {} +
Конечно, при удалении -n
программа запустит команду find
и избавит вас от проблем.
Я надеюсь, что это поможет всем, наконец, изучить этот {a,c,t}{time,min}
вариант.
вывод LS:
Вы также заметите, что параметр "ls" ls OPT
изменяется в соответствии с типом выбранного времени.
Ссылка для клонирования/загрузки oldfiles
script:
https://github.com/drbeco/oldfiles