Go to content Go to menu Go to search

Примеры использования команды find

Команда find – это один из мощнейших инструментов linux-администратора.
Ниже приведена шпаргалка по этой замечательной команде.

Найти файл по имени без учета регистра

начиная с текущего каталога рекурсивно:

find -iname "MyCProgram.c"

в каталоге рекурсивно:

find /var -iname syslog*

ограничить поиск только текущей файловой системой (-xdev должен быть после пути поиска но до аргументов поиска)

find /var -xdev -iname syslog*

Найти файл с расширением .vm с указанным текстом внутри

find . -iname *.vm | xargs grep "Remind"

Ограничить глубину поиска (-maxdepth / -mindepth)

find /var -maxdepth 2  -iname syslog*
find /var -maxdepth 5 -mindepth 3 -iname syslog*

Инверсия условия поиска (-not)

find /var -not  -iname syslog*

Найти файл по Inode и переименовать

Это может понадобиться, если к примеру в имени файла есть спец. символы, и переименовать стандартными методами не получается

~# find /var -iname syslog -exec ls -i1 {} \;
     3932232 /var/log/syslog
     3932189 /var/log/installer/syslog
~# find /var -inum 3932232 -exec mv {} new-test-file-name \;

Найти файлы с правами запуска для группы

find /bin -perm -g=x -type f

Найти пустые файлы или каталоги

файлы и каталоги

find /var/log -empty

только файлы

find /var/log -empty -type f

только каталоги

find /var/log -empty -type d

Найти все файлы свежее чем этот

find /var/log -newer /var/log/syslog.1

Поиск файлов на основании размера

найти файлы больше чем

find /var/log -size +100M

найти файлы меньше чем

find /var/log -size -100M

найти файлы точно в размер

find /var/log -size 100M

Ключи -ctime -mtime -atime -amin – cmin – mmin

Access time – время доступа
Modification time – время изменения содержимого в файле
Change time – время обновления файла. (например если мы поменяли атрибуты доступа, то изменится ctime в то же время mtime не изменится)

Опции time и min означают дни и минуты

Найти файлы, которые были изменены за последний час

find /var/log -mmin -60  -type f

Найти файлы, которые были изменены ранее чем час назад (файлы старше чем 1час)

find /var/log -mmin +60 -type f

Выполнение операций над найденными файлами

Общий синтаксис:

find <CONDITION_to_Find_files> -exec <OPERATION> \;

Где <OPERATION> это команда или скрипт.
Для передачи имени найденного файла используется конструкция из двух скобок {}

пример:
найти все файлы с именем syslog и вывести их inode

find /var -name syslog -type f -exec ls -i1 {} \;

*скобки {} можно применять в рамках только одной команды! *

например вот эта команда сработает без проблем:

find -name "*.txt" cp {} {}.bkup \;

а вот эта команда сработает не верно! Здесь отработают только скобки в команде mv:

find -name "*.txt" -exec mv {} `basename {} .htm`.html \;

Для того, что бы осуществить задачу нужно создать отдельный скрипт и запустить его из find, передав в качестве аргумента {}:

echo "mv "$1" "`basename "$1" .htm`.html"" > mv.sh
find -name "*.html" -exec ./mv.sh '{}' \;

Форматированный вывод

find /var -type file -name syslog -prinf '<FORMAT>'

usable ключи форматирования:

\a     Alarm bell.
\n     Newline.
\t     Horizontal tab.

%c     File's last status change time  in  the  format  returned  by  the  C
                     `ctime' function.
%f     File's name with any leading directories removed (only the last  ele
                     ment).
%g     File's group name, or numeric group ID if the group has no name.
%h     Leading directories of file's name (all but the  last  element).   If
                     the  file name contains no slashes (since it is in the current direc
                     tory) the %h specifier expands to ".".
%i     File's inode number (in decimal).
%k     The amount of disk space used for this file in 1K blocks. Since  disk
                     space  is allocated in multiples of the filesystem block size this is
                     usually greater than %s/1024, but it can also be smaller if the  file
                     is a sparse file.
%b     The amount of disk space used for this file in 512-byte blocks. Since
                     disk space is allocated in multiples of  the  filesystem  block  size
                     this  is  usually  greater than %s/512, but it can also be smaller if
                     the file is a sparse file.
%m     File's permission bits (in octal).   This  option  uses  the  `tradi
                     tional' numbers which most Unix implementations use, but if your par
                     ticular implementation uses an unusual ordering of octal  permissions
                     bits,  you  will  see  a  difference  between the actual value of the
                     file's mode and the output of %m.   Normally you will want to have  a
                     leading  zero  on  this  number, and to do this, you should use the #
                     flag (as in, for example, `%#m').
%M     File's permissions (in symbolic form, as for ls).  This directive  is
                     supported in findutils 4.2.5 and later.
%p     File's name.
%P     File's name with the name of the command line argument under which it
                     was found removed.
%s     File's size in bytes
%t     File's last modification time in the format returned by the C `ctime'
                     function.
%u     File's user name, or numeric user ID if the user has no name.
%U     File's numeric user ID
%Y     File's type (like %y), plus follow symlinks: L=loop, N=nonexistent

Можно запускать два поиска в одной команде

Профит в том, что за один проход по файловой системе выполняется несколько поисков.

Например следующая команда рекурсивно проходит по файловой системе один раз, при этом сохраняет список файлов с флагом setuid в файл /root/suid.txt, а список с большими файлами в /root/big.txt

find /  \( -perm -4000 -fprintf /root/suid.txt '%#m %u %p\n' \) , \
 \( -size +100M -fprintf /root/big.txt '%-10s %p\n' \)

Enjoy!


при публикации материалов с данного сайта обратная ссылка на сайт обязательна.
valynkin.ru © no rights reserved