Найти файлы рекурсивно linux

How to Search for Files Recursively into Subdirectories

I am trying to look for all XML files in a particular directory and all sub-directories (recursively) inside it. ls -R *.xml is only listing files in the current directory. I am quite sure, the sub-folders themselves have several .xml files, but none are showing up. Is this a configuration issue?

5 Answers 5

. is the current directory. If you need to search in another directory, replace . with the directory path.

Does it search for the required file recursively in the directory rooted at current directory. In my case it just checked in the current directory only, didn’t check the subdirectory.

Actually I searched for .php files in current directory. But it returned only .php files in current directory, didn’t searched recursively in sub-directories. That’s why I’m asking whether find command searches recursively or not.

@mostafiz, the find command searches recursively. If you don’t quote the parameter, I think your shell might do an expansion on the * , so it will match the files in the current directory.

sudo find . -print | grep -i '.*[.]xml' 

-1 for mixing find and grep , when find can do filtering using both regexes and globs, and not using find ‘s -print0 and grep’s -z when you do need to mix.

ls doesn’t have options to filter the output. For that you would need to use pipe. This passes the output from ls to grep , which then filters them to show just the .xml files.

bash

Using globstar shell option, we can make use of recursive globbing ./**/*

bash-4.3$ shopt -s globstar bash-4.3$ for i in ./**/*.xml; do printf "%s\n" "$i" ; done ./adwaita-timed.xml ./bin/hw5/stuff/book/chapter42servletexample/build/web/META-INF/context.xml ./bin/hw5/stuff/book/chapter42servletexample/build/web/WEB-INF/beans.xml ./bin/hw5/stuff/book/chapter42servletexample/build/web/WEB-INF/web.xml 

Perl

Perl has a module Find , which allows for recursive directory tree traversal. Within the special find() function, we can define a wanted subroutine and the directory that we want to traverse, in this example that’s . . The one-liner in such case would be:

bash-4.3$ perl -le 'use File::Find; find(sub,".")' ./adwaita-timed.xml ./CLEAR_DESKTOP/blahblah/hw5/stuff/book/jsf2demo/build/web/WEB-INF/beans.xml ./CLEAR_DESKTOP/blahblah/hw5/stuff/book/jsf2demo/build/web/WEB-INF/web.xml ./CLEAR_DESKTOP/blahblah/hw5/stuff/book/liangweb/build.xml 

Python

While Perl has a whole module dedicated to recursive tree traversal, Python has a neat function walk() that is part of os module, and repeatedly returns tuple of topmost path, list of all subdirectories, and list of filenames. We can do the following:

bash-4.3$ python -c 'import os,sys; [ sys.stdout.write(os.path.join(r,i)+"\n") for r,s,f in os.walk(".") for i in f if i.endswith(".xml") ]' ./adwaita-timed.xml ./CLEAR_DESKTOP/blahblah/hw5/stuff/book/jsf2demo/build/web/WEB-INF/beans.xml ./CLEAR_DESKTOP/blahblah/hw5/stuff/book/jsf2demo/build/web/WEB-INF/web.xml ./CLEAR_DESKTOP/blahblah/hw5/stuff/book/liangweb/build.xml 

This might be far neater as a script:

#!/usr/bin/env python import os,sys for r,s,f in os.walk("."): for i in f: if i.endswith(".xml") print(os.path.join(r,i)) 

find

Other answers have mentioned find for recursive traversal, and that’s the go-to tool for the job. What does need mention is the fact that find has multiple command line switches, such as -printf to print output in desired format, -type f to find only regular files, -inum to search by inode number, -mtime to search by modification date, -exec <> \; to execute a particular command to process the file with passing file as argument ( where <> is standard find placeholder for current file) , and many others so please read the manpage for find .

Читайте также:  Linux для юридических лиц

Источник

Как найти файл в Linux? Руководство по команде find с примерами

img

Когда нужно найти какой-нибудь файл или папку в системе Linux в голову сразу приходит команда find. Она проста в использовании и имеет множество разных опций, которые позволяют оптимизировать поиск файлов. Далее приведём несколько примеров использования этой команды.

Поиск папок

Чтобы сделать поиск по папкам команде find нужно передать параметр type d. Таким образом мы скажем команде find вести поиск только по директориям:

$ find /path/to/search -type d -name "name-of-dir"

Руководство по команде find с примерами

Поиск скрытых файлов

Так как скрытые файлы и директории в Linux начинаются с точки, то мы можем задать шаблон поиска так, чтобы команда рекурсивно выводила нам все скрытые файлы и директории. Для этого достаточно ввести следующую команду:

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

Команда find дает возможность вести поиск файлов размером больше, меньше или равным указанному значению. Чтобы найти файл размером больше 10Мб нужно ввести команду:

$ find /path/to/search -size +10M

Для поиска файлов размером меньше указанного значения или равного ему нужно ввести следующие команды:

$ find /path/to/search -size -10M $ find /path/to/search -size 10M

Также есть возможность искать файлы размер которых находится в указанном промежутке.

$ find /path/to/search -size +100M -size -1G

Поиск файлов по списку

Допустим нам нужно найти несколько файлов, указанные в списке, который хранится в виде файла с расширением .txt. Для этого мы можем воспользоваться комбинацией команд find и grep. Чтобы данная команда работала корректно, каждый шаблона поиска в списке должен начинаться с новой строки.

$ find /path/to/search | grep -f filelist.txt

Парметр f переданный команде grep означает файл и даёт нам возможность указать файл с шаблонами для поиска. В результате работы вышеуказанной команды система вернёт нам все файлы, название которых указаны в списке.

Найти файл, которого нет в списке

Так же в системе Linux есть возможность поиска, противоположная указанному выше. То есть мы можем искать файлы, которые не указаны в списке файлов. Для этого команде grep передадим параметр vf, что означает обратное сопоставление и вернет нам файлы, названий которых не найдёт в списке шаблонов.

$ find /path/to/search | grep -vf filelist.txt

Указываем максимальную глубину поиска

По умолчанию, команда find ищет файлы во всех директориях и поддиректориях. Допустим, если мы в качестве пути для поиска укажем корневую директорию «/», то система будет искать искомый файл по всему жесткому диску. Мы можем ограничить область поиска командой maxdepth указав ему насколько глубоко нужно искать файл.

$ find . -maxdepth 0 -name "myfile.txt"

Команды указанная выше говорит системе искать файл только в указанной директории. А следующая команда предписывает вести поиск в указанной директории и в одной поддиректори.

$ find . -maxdepth 1 -name "myfile.txt"

Поиск пустых файлов

Команда find также позволяет вести поиск по пустым файлам и директориям. Для этого команде добавляем флаг empty. Следующие две команды позволяют найти пустые файли и папки. Для поиска папок к строке поиске добавляет ключ d:

$ find /path/to/search -type f empty $ find /path/to/search -type d empty

Так же можно автоматически удалять найденные пустые файлы или папки. Следующая команда найдет и удалит все пустые файлы в указанной папке и всех подпапках:

$ find /path/to/search -type f -empty delete

Поиск самого большого файла или папки

Если нужно быстро определить какой файл или какая папка в системе занимает больше всего места, то команда find с соответствующими ключами позволит нам рекурсивно искать и сортировать файлы/папки по их размеру:

$ find /path/to/search -type f -printf "%s %p " | sort -n | tail -1

Заметьте, что при поиске мы прибегнули к двум другим удобным инструментам Linux: sort и tail. Sort отсортирует файл по их размеру, а tail покажет самый последний файл в списке, который и будет самым большим файлом/папкой. Мы можем изменить команду так, чтобы она выводила пять самых больших файлов для этого нужно воспользоваться следующей командой:

$ find /path/to/search -type f -printf "%s %p " | sort -n | tail -5

Также можно вывести файлы с самым меньшим размером. Следующая команда позволит вывести пять самых маленьких по объёму файлов:

$ find /path/to/search -type f -printf "%s %p " | sort -n | head -5

Чтобы найти самую большую папку по указанному пути нужно ввести команду указанную ниже:

$ find /path/to/search -type d -printf "%s %p " | sort -n | tail -1

Поиск файлов с атрибутом setuid

Атрибут setuid файла позволяет обычному пользователю запускать файлы от имени root-а. Такие файлы тоже легко найти с помощью команды find и нескольких параметров. Команда имеет два параметра, которые позволяют искать файлы с конкретными правами: -user и perm. Чтобы найти файлы, который можно запускать от имени root-а можем прописать команду:

$ find /path/to/search -user root -perm /4000

Как найти файл в Linux

На скриншоте мы добавили еще параметр exec чтобы ограничить вывод команды find. Полная команда выглядит так:

$ find /path/to/search -user root -perm /4000 -exec ls -l <> ;

Мы можем заменить root любым другим пользователем или просто опустить этот параметр и найти все файлы с правами запуска от имени root-а:

$ find /path/to/search -perm /4000

Поиск файлов с атрибутом sgid

Команда поиск файлов с атрибутом sgid почти такая же как и для SUID с той разницей, что вместо 4000 прописываем 2000:

$ find /path/to/search -perm /2000

Так же можем найти файлы, которые имеют оба указанных атрибута:

$ find /path/to/search -perm /6000

Исключение из вывода файлов и папок, к которым нет доступа

Чтобы вести поиск пользователь должен иметь доступ на чтение в указанной папке и подпапках. Если нет соответствующих прав, то мы получим ошибки как на скриншоте ниже.

Permission denied

Этот случай особо актуален при поиске в корневой директории. Согласитесь сильно засоряет вывод, но этого можно избежать если перенаправить вывод stderr в stdout и передать grep для обработки. Следующей командой мы выведем все результаты работы команды find кроме строк, содержащих слова "Permission denied"^

$ find / -name "myfile.txt" 2>%1 | grep -v "Permission denied"

Поиск файлов изменённых за последние X дней

Чтобы найти файлы, которые были изменены за указанный период времени используется параметр mtime. Ниже приведены несколько примеров для поиска файлов, изменённых за последний 30 дней, больше 30 дней и меньше чем за 30 дней:

$ find /path/to/search -type f -mtime 30 $ find /path/to/search -type f -mtime +30< $ find /path/to/search -type f -mtime -30

Чтобы вывести более детальную информацию о найденных файлах можно указать параметр exec:

$ find /path/to/search -type f -mtime -30 -exec ls -l <> ;

Сортировка результатов по времени

При необходимости отсортировать результате по времени можно воспользоваться параметром printf и утилитой sort:

$ find /path/to/search -printf "%T+ %p " | sort

По умолчанию sort упорядочивает файлы от старых к новым. Чтобы указать обратный порядок сортировки достаточно добавить ключ r к команде sort:

$ find /path/to/search -printf "%T+ %p " | sort r

Разница между locate и find

В системе Linux есть и другая команда, позволяющая вести поиск файлов locate. Но так как она не имеет таких параметров поиска, как find, она не очень гибка, но достаточно практична.

Утилита locate ведёт поиск по базе, которая содержит все имена файлов, находящихся в системе. Так как команда locate не ищет указанный файл по всей системе, то она намного эффективней утилиты find. Но с другой стороны база данных этой утилиты обновляется раз в день, что не позволяет найти файлы, созданные раньше, чем 24 часов. Базу данных можно вручную обновлять командой updatedb.

Команда locate особенно полезна если нужно вести поиск файла по всему жесткому диску, так как find в этом случае понадобиться больше времени, так как он проходится по всем директориям в реальном времени.

Если же поиск ведётся в папке, где мало файлов, то лучше пользоваться командой find.

Нагрузка CPU командой find

При поиске по большим каталогам команда find может требовать больше ресурсов. Это должно по своей сути позволять более важным системным процессам иметь приоритет, но если необходимо, чтобы команда find употребляла меньше ресурсов машины, можно использовать команду ionice или nice.

Просмотреть состояние процессора можно командой:

Чтобы понизить приоритет Ввода/Вывода для команды find, можно ввести следующую команду:

$ ionice -c3 -n7 find /path/to/search -name "myfile.txt"

А чтобы понизить приоритет использования CPU, нужно ввести следующую команду:

$ nice -n 19 find /path/to/search -name "myfile.txt"

Или можно эти две команды комбинировать, чтобы обеспечить низкий приоритет как для Ввода/Вывода, так и для CPU.

Источник

Оцените статью
Adblock
detector