Ограничиваем поиск конкретной директорией и уровнями вложенных поддиректорий
Для начала сделаем поиск passwd в корневой директории root и всех поддиректориях. Эта команда проведет поиск во всех каталогах, куда Вам разрешен доступ; если Вы не имеете прав прочесть содержимое каталога, find
сообщит, что поиск в данном каталоге Вам запрещен.
# find / -name passwd
./usr/share/doc/nss_ldap-253/pam.d/passwd
./usr/bin/passwd
./etc/pam.d/passwd
./etc/passwd
Теперь ограничим поиск самой корневой директорией root (level 1) и поддиректориями (level 2).
# find -maxdepth 2 -name passwd
./etc/passwd
Теперь ограничим поиск корневой директорией и поддиректориями для уровня ниже (level 2, level 3)
# find / -maxdepth 3 -name passwd
./usr/bin/passwd
./etc/pam.d/passwd
./etc/passwd
Теперь ограничим поис файлов между уровнями level 2 и level 4
# find -mindepth 3 -maxdepth 5 -name passwd
./usr/bin/passwd
./etc/pam.d/passwd
Поиск файлов с одновременным выполнением операций над ними
Найдём все файлы MyCProgram.c без учёта регистра букв и одновременно вычислим для каждого из них md5sum. Внутри фигурных скобок будут автоматически подставлять найденные файлы.
md5sum — программа, позволяющая вычислять значения хеш-сумм (контрольных сумм) файлов по алгоритму MD5. В обычном случае вычисленные хеши выводятся (можно сохранить в файле, для последующего использования). В других случаях, программа сверяет вычисленные значения со значениями, сохраненными в файле (это удобно для массовой проверки целостности файлов). Наиболее часто программа используется для проверки правильной загрузки файлов по сети.
# find -iname "MyCProgram.c" -exec md5sum {} ;
d41d8cd98f00b204e9800998ecf8427e ./mycprogram.c
d41d8cd98f00b204e9800998ecf8427e ./backup/mycprogram.c
d41d8cd98f00b204e9800998ecf8427e ./backup/MyCProgram.c
d41d8cd98f00b204e9800998ecf8427e ./MyCProgram.c
Какие действия можно выполнять при поиске:
-print
Выводит полный путь с именем файла в стандартный вывод-ls
Выводит полный листинг файла (эквивалентно команде ls -dils
)-delete
Удаляет файл-exec command
Выполняет указанную команду. Все последующие аргументы до появления; считаются аргументами команды. Строка {}
заменяется именем текущего файла
Вот пример, в котором используется действие -exec
, которое перемещает все найденные файлы в каталог для резервного копирования. Здесь есть несколько вещей, которые нужно отметить. Обозначение {}
будет заменено на полный путь найденного файла, а ;
используется для обозначения окончания команды, следующей за -exec
. Помните, что ;
— это также специальный символ оболочки, и нужно поставить перед ним обратный слэш, чтобы оболочка его не обрабатывала.
$ find ~ -mtime +365 -exec mv {} /tmp/mybackup ;
Чтобы найти все файлы в каталоге /html/ с расширением .html, и вывести строки из этих файлов, содержащие слово organic, введите:
$ find ~/html/ -name '*.html' -exec grep organic '{}' ';'
Чтобы ввести подтверждение выполнения команды для файла, найденного find
, используйте ключ-ok
вместо -exec
. Чтобы удалить из Вашего домашнего каталога файлы, доступ к которым осуществлялся более года назад, с подтверждением для каждого файла, введите:
$ find ~ -used +365 -ok rm '{}' ';'
Поиск файлов, не являющихся тем, что указано в условии
Найдем файлы, имя которых не совпадает с MyCProgram.c (регистр букв не учитывается). При этом искать будем только в текущей директории (level 1)
# find -maxdepth 1 -not -iname "MyCProgram.c"
.
./MybashProgram.sh
./create_sample_files.sh
./backup
./Program.c
Еще вариант использовать вместо -not
обратный слеш с восклицательным знаком:
# find ! -iname "MyCProgram.c”
Найдем файлы в каталоге /bin, владельцем которых не является root:
$ find /usr/bin ! -user root
Поиск файла по уникальному номеру inode
В информатике инодом (или индексным дескриптором) (произносится айнод или инод) называют структуру данных в традиционных файловых системах Unix, таких как UFS. Инод хранит основную информацию о постоянных файлах, каталогах или других объектах файловой системы. А слово node переводится как узел, узловая точка.
При создании файловой системы создаются также и структуры данных, содержащие информацию о файлах. Каждый файл имеет свой инод, идентифицируемый по номеру инода (часто называемый 'i-номером' или инодом), в файловой системе, в которой располагается сам файл.
Иноды хранят информацию о файлах, такую как принадлежность владельцу (пользователю и группе), режим доступа (чтение, запись, запуск на выполнение) и тип файла. Существует определенное числоинодов, которое указывает максимальное количество файлов, допускаемое определенной файловой системой. Обычно, при создании файловой системы примерно 1% ее выделяется под иноды.
Создадим два файла с одинаковыми именами, у второго файла в конце имени пробел. При листинге файлов визуально их никак нельзя отличить друг от друга.
# touch "test-file-name"
# touch "test-file-name "
[Примечание: Пробел в конце файла]
# ls -1 test*
test-file-name
test-file-name
Теперь с помощью опции –i
покажем в листинге их номера inode, они различны:
# ls -i1 test*
16187429 test-file-name
16187430 test-file-name
При поиске файлов тоже можно использовать его номер inode, используя -inum
. Найдём файл сinode=16187430 и переименуем его. При последующем листинге увидим, что изменилось имя одного файла с тем самым inode.
# find -inum 16187430 -exec mv {} new-test-file-name ;
# ls -i1 *test*
16187430 new-test-file-name
16187429 test-file-name
Можно пользоваться этой техникой при совершении действий над файлами с малоинформативными названиями. Например, файл file?.txt содержит спецсимвол — вопросительный знак, который обычно используется в поиске для указания, что на его месте может быть любо символ. Поэтому если вы попытаетесь удалить этот файл rm file?.txt
, то удалятся все три файла, которые похожи на него по имени и содержат в позиции вопросительного знака цифры 1 и 2. Итак, у нас три файла:
# ls
file1.txt file2.txt file?.txt
Чтобы удалить файл с вопросительным знаком, покажем их inode:
# ls -i1
804178 file1.txt
804179 file2.txt
804180 file?.txt
И теперь удалим только файл с inode=804180
# find -inum 804180 -exec rm {} ;
# ls
file1.txt file2.txt
[Note: The file with name "file?.txt" is now removed]
С другой стороны, пример надуман, потому что существует более простой способ удаления file?.txt
rm "test?.txt”