Часто у меня спрашивают: "как по 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
Комментарии ()