Примеры использования команды 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!