полезности под линукс как найти шелку в скрипте и какие команды юзать
Великий, могучий shell scripting. Сила FIND.
Когда я впервые столкнулся с ОС Linux, я был немного обескуражен количеством утилит и команд в оболочке командного интерпретатора. С одной стороны это радовало своими возможностями и многообразием, а с другой – вводило мозговую активность в бурное замешательство.
У меня начали возникать различные задачи по работе с файлами, текстами и т.п. и я начал понемногу осваивать shell scripting.
Успех любого начинания – хорошая документация и таковая нашлась (спасибо Мендел Куперу): Advanced Bash-Scripting Guide.
Если Вы в совершенстве овладеете хотя-бы частью того, что описано в данной документации, можете считать себя гуру shell scripting.
Итак, в данном разделе, я буду описывать задачки, которые я успешно решал с помощью командного интерпретатора и утилит Linux.
Пожалуй, приступим.
Имеем задачу: необходимо изменить у множества файлов и директорий, расположенных в различных каталогах нашей файловой системы, желаемые атрибуты (права доступа или владельца), причем для файлов нужны одни атрибуты, для директорий другие.
Для тех, кто хоть как-то знаком с командной строкой в Linux, на ум приходят две популярные команды, с помощью которых можно решить данную задачку, это chmod и chown, которые можно запустить с опцией рекурсии, но как-же отделить файлы от директорий?
На помощь приходит одна из самых полезных утилит – FIND.
Задачка решается красиво и быстро:
find . -type d -exec chmod 750 {} ;
find . -type f -exec chown user:usergr {} ;
Расшифрую: Найти (find) начиная с текущей директории и ниже (.) все директории (-type d) и выполнить (-exec) команду (chmod 750) для этих ({}) найденных объектов (; – конец опции -exec)
Аналогично для файлов:
find . -type f -exec chmod 640 {} ;
find . -type f -exec chown user:usergr {} ;
или для определенных файлов, допустим с расширением .log в директории /var/log:
find /var/log -type f –name ‘*.log’ -exec chmod 640 {} ;
Find – это незаменимый инструмент в умелых руках, если Вы дружите с английским, почитайте man к find (man find) или русские переводы на данную тему, к примеру здесь, а я приведу еще примеры:
чистим архивы от файлов, которые были модифицированы в последний раз более 30 дней назад:
find /archive -mtime +30 -exec rm {} ;
и на закуску, более комплексный пример, который ищет самый «свежий» файл, т.е. файл с самым последним (самым новым) временем доступа к нему:
find . -type f -printf «%A@ %p
» | sort | tail -n 1 | sed -e «s/[0-9]* //»
Люблю команды в одну строку
Расшифрую: Найти (find) начиная с текущей директории и ниже (.) все файлы (-type f) и вывести их (-printf) в формате: «время последнего доступа к файлу, ввиде количества секунд с 1 Января 1970 года по часовому поясу 00:00 GMT (%A@), далее пробел ( ) полное имя файла(%p) и перевод строки(
)», затем отсортировать их ( | sort) и взять последний с конца отсортированного списка ( | tail -n 1), затем отредактировать полученную строку ( | sed) заменив в строке подстроку содержащую набор цифр и пробел ( -e «s/[0-9]* //») на пустоту.
продолжение следует-------
find – shell команда для поиска файлов и каталогов в иерархии каталогов. Рассмотрим некоторые способы использования этой команды и несколько ее опций поиска.
Самый простой пример нахождения файла по имени с помощью команды find:
find . -name test
после написания find пишем путь к папке, где надо искать, мы указали точку, то есть искать в текущем каталоге. Дальше ключ -name используется для поиска по имени, после его следует имя папки или файла, который мы ищем.В данном примере мы указали команде искать файл по названию test в текущем каталоге (. – точка это обозначение текущего каталога)
find . -iname test
- тот же поиск по имени, но без учета регистра в названии файлов.
Но, дело в том, что в примере выше мы не указали, что ищем именно файл, по тому, если в текущем каталоге или его подкаталоге существует папка из названием test, то она тоже попадет в результаты поиска. Для указания того, что мы ищем именно файл, и что названия папок в результаты поиска включать не надо, используем ключ «-type»
find . -type f -name test
«-type f» – мы указали, что ищем именно файл (f)
Для того, чтобы в результат включить одни папки с названием test, а файлы не искать, используем
«-type d»
find . -type d -name test
А что, если нам надо найти все файлы с расширением «.db», тогда используем звездочку «*».
* – заменяет любой набор символов. И того, для поиска всех файлов с расширением «.db» в каталоге /var/named используем следующую команду:
find /var/named -type f -name *.db
Тут мы заменили каталог для поиска на /var/named.
Если надо найти файлы или папки по дате их создания или последнего доступа к ним, используем ключ «-atime» – поиск по дате последнего доступа к файлу (или же его созданию, если никто к нему еще не доступался).
find . -type f -atime 1
Мы указали что ищем все фалы в текущем каталоге, которые были созданы или же к ним последний раз доступались за прошлые сутки, то есть больше чем 24 часа и меньше чем 48 часов назад. «-atime n» – считается n*24, то есть в нашем случае 1*24=24 часа назад, и команда ищет именно сколько 24-часовых периодов назад доступались к файлу.
А вот следующая команда найдет все файлы, к которым доступались больше чем 24 назад:
find . -type f -atime +1
Дальше можем найти все папки, к которым доступались больше чем 48 часов назад:
find . -type d -atime +2
Все файлы, к которым доступались за последние сутки:
find . -type f -atime -1
По этому же принципу можем использовать ключи
«-ctime n» – по дате создания или изменения статуса файла или папки
«-mtime n» – поиск файлов, которые были изменены(редактированы, или созданы) n*24 часов назад
«-amin n» – файлы или папки, к которым доступались n минут назад
«-cmin n» – файлы или папки, статус которых был изменен(или были они созданы) n минут назад
«-mmin» – файлы или папки, которые были изменены(или созданы) n минут назад
Можно производить поиск файлов и каталогов по их владельцу(юзеру), используя ключ «-user»:
find . -name *.jpg -user nobody
Мы указали что ищем в текущем каталоге все файлы с расширением .jpg, у которых стоит владелец nobody
Рассмотрим ситуацию, когда нам надо над результатом поиска выполнить какую-либо команду, например удалить все найденные файлы. В таком случае используем ключ «-exec». Он используется для указания другой команды, которую надо выполнить над каждым аргументом результат поиска:
find /tmp -type f -name sess* -exec rm -f {} \;
«/tmp» – указываем что ищем файлы в папке /tmp
«-type f» – ищем только файлы и каталоги в результат поиска не включать
«-name sess*» – все файлы, имя которых начинается из слова «sess»
«-exec rm -f {}» – запустить команду «rm -f»(удаление) для каждого файла
«{}» – заменяет список найденных аргументов
«\;» – конец команды (в данном случае использования «find» указывать обязательно)
Следующий пример показывает как поменять права на все файлы в папке:
find /home/nobody/public_html -type f -exec chmod 644 {} \;
и на все папки:
find /home/nobody/public_html -type d -exec chmod 755 {} \;
Но при замене прав на папки данной командой, на сам каталог public_html тоже права изменяются, так как в результаты будет включен текущий каталог, который обозначается точкой «.». Тогда возвращаем назад:
chmod 750 public_html
Пример того, как можно с помощью команды «find» найти все файлы .htaccess в аккаунте и закоментировать пхп переменные в нем:
find /home/nobody/public_html -type f -name .htaccess -exec replace "php_admin_flag" "#php_admin_flag" -- {} \;
find /home/nobody/public_html -type f -name .htaccess -exec replace "php_flag" "#php_flag" -- {} \;
find /home/nobody/public_html -type f -name .htaccess -exec replace "php_admin_value" "#php_admin_value" -- {} \;
find /home/nobody/public_html -type f -name .htaccess -exec replace "php_value" "#php_value" -- {} \;