×

linux найти файлы по дате создания

Часто у меня спрашивают: "как по SSH получить в перечень файлов созданных на определенную дату?" или "у меня есть папка с большим количеством файлов. нужно найти в этой папке файлы с определенной датой и поместить их в архив. Как это можно сделать?"     Все очень просто, и сейчас мы разберем несколько часто встречающихся запросов.

В оболочках, основанных на Linux операционных системах, таких как Debian, Ubuntu,  Redhat или Centos мы можем в консоле задать следующие команды и посмотреть их выполнение:

 

Команда

Описание

pwd

показать текущую директорию

cd /home1

перейти в директорию '/home1'

cd ..

перейти в директорию уровнем выше

cd ../..

перейти в директорию двумя уровнями выше

cd

перейти в домашнюю директорию

cd ~user1

перейти в домашнюю директорию пользователя user1

cd -

перейти в директорию, в которой находились до перехода в текущую директорию

ls

отобразить содержимое текущей директории

ls -F

отобразить содержимое текущей директории с добавлением к именам символов, характеризующих тип

ls -l

показать детализированное представление файлов и директорий в текущей директории

ls -a

показать скрытые файлы и директории в текущей директории

ls *[0-9]*

показать файлы и директории содержащие в имени цифры

du -sk * | sort -rn

отображает размер и имена файлов и директорий, с сортировкой по размеру

man --help

справочное руководство.

find / -name file1

найти файлы и директории с именем file1. Поиск начать с корня (/)

find / -user user1

найти файл и директорию принадлежащие пользователю user1. Поиск начать с корня (/)

find /home/user1 -name "*.php"

Найти все файлы и директории, имена которых оканчиваются на '. php'. Поиск начать с '/home/user1'

find /usr/cgi -type f -mtime -11

найти все файлы в '/usr/cgi', созданные или изменённые в течении последних 11 дней

find /usr/bin -type f -atime +300

найти все файлы в '/usr/bin', время последнего обращения к которым  более 300 дней

rm -f file1 file2

удалить файл с именем 'file1' и 'file2'

rmdir dir1

удалить директорию с именем 'dir1'

rm -rf dir1

удалить директорию с именем 'dir1' и рекурсивно всё её содержимое

rm -rf dir1 dir2

удалить две директории и рекурсивно их содержимое

       

 

 Ну, и немного примеров:

подсчитать количество файлов в директории

 ls -A | wc -l     или    find -type f | wc -l

 находим все файлы в текущем каталоге и вывод отфильтровать по php и за дату Nov 2 2011 :

 ls -alR | grep 'Nov 2 2011'    | grep php  или  ls /home/user1 -alR | grep 'Nov 2 2011'   | grep php

 Внимательно смотрите на формат написания даты и количество пробелов

 'Nov . . 2 . . 2011' 'Nov.12 . . 2011'

 Вы можете сначала дать команду без [| grep 'Nov 2 2011' ] , затем скопировав дату и повторив ее уже с фильтром. Или find -type f -depth -1  | xargs ls -l    | grep php

 Если нужно не углубляться в подкаталоги ниже третьего уровня, используйте опцию -depth -3 :

 ls -alR  -depth -3  | grep 'Nov 2 2011'

 тоже самое, только с find:

 find -type f -depth -3  | xargs ls -l | grep 'Nov 2 2011'   | grep php

 " | xargs ls -l " - задаем вывод атрибутов файла
 " grep 'что-то в строках вывода' " - задаем фильтрование по строке

 и такое имеет место (найти файлы с 26 по 28 октября 2016) (не у всякого хостера работает newermt ):

find ./ -newermt 'Oct 26  2016' \! -newermt 'Oct 28  2016' -ls     или    find  -newermt 'Oct 27  2016' 

тогда найти все файлы созданные после создания файла config.php (определите у себя подходящий по дате)

find -type f -newer /home/user1/config.php  | xargs ls -l  | grep php         

найти все файлы и вывод отфильтровать по 'цифра.php':

find -type f | grep [0-9].php

найденное можно удалить вот так:

find -type f | xargs ls -l | grep 'Nov 2 2011'   | grep php  | xargs rm -f

find -type f | xargs ls -l | grep 'Nov 2 2011'   | grep php  -delete

find -type f | xargs ls -l | grep 'Nov 2 2011'   | grep php  -exec rm -f {} \;

или можете положить отобранные файлы в архив:

find /home/user1 -type f | xargs ls -l | grep 'Nov 2 2011'   | grep php -exec tar -cvf archive.tar {} \;

find /home/user1 -newermt 'Oct 27  2016'   | xargs  tar -czvf файл.tar.gz

 

Ключи:
-name — искать по имени файла, при использовании подстановочных образцов параметр заключается в кавычки.
-type — тип искомого: f=файл, d=каталог, l=ссылка (link).
-user — владелец: имя пользователя или UID.
-group — владелец: группа пользователя или GID.
-perm — указываются права доступа.
-size — размер: указывается в 512-байтных блоках или байтах (признак байтов — символ «c» за числом).
-atime — время последнего обращения к файлу.
-ctime — время последнего изменения владельца или прав доступа к файлу.
-mtime — время последнего изменения файла.
-newer другой_файл — искать файлы созданные позже, чем другой_файл.
-delete — удалять найденные файлы.
-ls — генерирует вывод как команда ls -dgils.
-print — показывает на экране найденные файлы.
-exec command {} \; — выполняет над найденным файлом указанную команду; обратите внимание на синтаксис.
-ok — перед выполнением команды указанной в -exec, выдаёт запрос.
-depth — начинать поиск с самых глубоких уровней вложенности, а не с корня каталога.
-prune — используется, когда вы хотите исключить из поиска определённые каталоги.
N — количество дней.

 Такие рассуждения и команды можете использовать для поиска файлов на сервере с вредоносным кодом. Примеры часто обнаруженных угроз смотрите - Как обнаружить зараженные файлы на своем на сайте и хостинге?

Иногда может потребоваться найти самые большие файлы в директории:

ls -lSrh

или

find / -mount -type f -ls 2> /dev/null | sort -rnk7 | head -10 | awk '{printf "%10d MB\t%s\n",($7/1024)/1024,$NF}'

или в директории  /home

find /home -mount -type f -ls 2> /dev/null | sort -rnk7 | head -10 | awk '{printf "%10d MB\t%s\n",($7/1024)/1024,$NF}'

Или самые большие папки (директории):

du -kx | egrep -v "\./.+/" | sort -n

03 ноября 2000, 19:46    Алина    11142

Комментарии ()