Удалить большой архив
Команда удаляет файлы с расширением *.zip, которые больше 100 мегабайт.
# find / -type f -name *.zip -size +100M -exec rm -i {} ;"
Удалить все файлы с расширением *.tar больше 100Mб используя сокращенный псевдоним rm100m (Remove 100M). Подобным же способом создаём команды для удаления архивов *.tar больше 1, 2 и 5Гб.
# alias rm100m="find / -type f -name *.tar -size +100M -exec rm -i {} ;"
# alias rm1g="find / -type f -name *.tar -size +1G -exec rm -i {} ;"
# alias rm2g="find / -type f -name *.tar -size +2G -exec rm -i {} ;"
# alias rm5g="find / -type f -name *.tar -size +5G -exec rm -i {} ;"
# rm100m
# rm1g
# rm2g
# rm5g
Поиск файлов с одновременным изменением прав доступа
Изменим свойства всех php-файлов (php, php4, php5) в директории /var/www/ на 644 (пользователь может изменять и читать, группа и остальные только читать):
find /var/www/ -name "*.php*” -exec chmod 644 {} ;
Найти файлы, заканчивающиеся определёнными символами/буквами
Найти в каталоге /etc (и во вложенных каталогах) все файлы, имена которых заканчиваются на .conf и владельцем которых является пользователь cupsys.
$ find /etc -name '*.conf' -user cupsys -print
find: /etc/ssl/private: Permission denied
find: /etc/cups/ssl: Permission denied
/etc/cups/cupsd.conf
/etc/cups/printers.conf
Удаление временных файлов
Удалим все файлы в текущей директории, заканчивающиеся на ~. Обычно файлы с тильдой на конце являются временными файлами, созданными текстовыми редакторами. Этим же способом можно удалить файлы, заканчивающие любыми нужными символами. Вместо xargs безопаснее использоватьfind . -print0 | xargs -0 cmd
find -name "*~” | xargs rm #is equivalent to rm -r "*~” ;
Поиск файлов, измененных в определённое время
В четырёх строках ниже производится четыре поиска файлов: тех, что были изменены за предыдущий день, за последние десять минут, более чем год назад и ровно 4 дня назад (четвёртый поиск, наверное, не самый остро необходимый). Внимание: если перед цифрой не стоит + или –, то ищутся файли, изменённые ровно в указанное время.
$ find . -ctime -1 -type f
$ find ~ -mmin -10
$ find ~ -mtime +365
$ find ~ -mtime 4
Опция -daystart
определяет отсчет времени с момента начала текущих суток.
Чтобы вывести все файлы в Вашем домашнем каталоге, модифицированные вчера, введите:
$ find ~ -mtime 1 -daystart
Чтобы вывести все файлы в каталоге /usr, модифицированные в течение года, введите:
$ find /usr -mtime +356 -daystart
Чтобы вывести все файлы в Вашем домашнем каталоге, модифицированные в период от 2 до 4 дней тому назад, наберите:
$ find ~ -mtime 2 -mtime -4 -daystart
Чтобы найти все файлы новее определенной даты, используйте следующий трюк: создайте временный файл в каталоге /tmp и установите дату его модификации на требуемую с помощью touch, а затем определите его как аргумент для -newer
. Чтобы вывести все файлы в Вашем домашнем каталоге, модифицированные после 4 мая текущего года, введите:
$ touch -t 05040000 /tmp/timestamp
$ find ~ -newer /tmp/timestamp
Поиск средствами which и whereis
Программа whereis
производит поиск исполняемого файла, исходного кода и документации (страницы руководства) для заданной команды, просматривая каталоги из заранее определенного списка. Выведем информацию о местонахождении исполняемого (двоичного) файла и man-страницы для команды ls
.
$ whereis ls
ls: /bin/ls /usr/share/man/man1/ls.1.gz
Команда which
еще более специализирована. Она ищет путь до заданной команды и выводит первый результат. Следующая команда сообщает, что команда vi — это исполняемый файл /usr/bin/vi. По сути, это ответ на вопрос: «Если бы я ввел команду vi, то какая программа запустилась бы на самом деле?»
$ which vi
/usr/bin/vi
Чтобы определить, установлен ли в Вашей системе perl и где он расположен, введите:
$ which perl
/usr/bin/perl
Поиск по содержимому файлов с помощью grep
Как мы убедились, средства поиска типа find
могут искать файлы по имени, размеру, владельцу, времени доступа и многим другим параметрам, но не могут искать файлы по содержимому. Оказывается, файлы достаточно изящно находятся по содержимому при помощи grep
, используемой совместно с шаблонами оболочки для файлов. В примере ниже мы просим grep
вывести имена файлов, содержащих строку Hudson. Шаблон */* разворачивается оболочкой и означает список всех файлов, находящихся на один уровень ниже текущего каталога.
$ grep -l Hudson */*
Desktop/suse_book_press_release.txt
google-earth/README.linux
Mail/inbox.ev-summary
Mail/sent-mail.ev-summary
snmp_training/enterprise_mib_list
Если нужно наложить некоторые условия на имя файла, следующей командой будем искать только файлы с расширением .txt, внутри которых есть строка Hudson:
$ grep -l Hudson */*.txt
Desktop/search_tools.txt
Desktop/suse_book_press_release.txt
Можно расширить диапазон поиска и на большее количество уровней, но на практике весьма вероятна ситуация, когда подставленных файлов будет столько, что строка со списком аргументов превысит допустимую длину:
$ grep -l Hudson */* */*/*
bash: /bin/grep: Argument list too long
Более эффективный подход — использовать grep
совместно с find
. Поиск файлов с расширением .txt, содержащих строку Hudson и находящихся в моем домашнем каталоге ('~'), выглядит так:
$ find ~ -name '*.txt' -exec grep -q Hudson {} ; -print
/home/chris/Desktop/search_tools.txt
/home/chris/Desktop/suse_book_press_release.txt