Как искать файлы рекурсивно в подкаталогах

Я пытаюсь найти все XML файлы в определенном каталоге и все подкаталоги (рекурсивно) внутри него.

ls -R *.xml перечисляет только файлы в текущем каталоге. Я совершенно уверен, что в самих подпапках есть несколько .xml файлов, но ни один из них не отображается.

Это проблема конфигурации?

118
задан 14 June 2013 в 00:06

5 ответов

Попробуйте использовать Найти

sudo find . -print | grep -i '.*[.]xml'
0
ответ дан 14 June 2013 в 00:06

Вы можете сделать это с помощью , найдите только :

find . -name '*.xml'

. - текущий каталог. Если вам нужно выполнить поиск в другом каталоге, замените . на путь к каталогу.

0
ответ дан 14 June 2013 в 00:06

Попробуйте эту команду:

ls -R | grep '.*[.]xml'

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

0
ответ дан 14 June 2013 в 00:06

удар

Используя globstar опция оболочки, мы можем использовать рекурсивный 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 имеет модуль Find, который допускает рекурсивный обход дерева каталогов. В специальном предложении find() функция, мы можем определить требуемую подпрограмму и каталог, который мы хотим пересечь в этом примере, который это .. Острота в таком случае была бы:

bash-4.3$ perl -le 'use File::Find; find(sub{-f && $_ =~ /.xml$/ && print $File::Find::name},".")' 
./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

В то время как Perl выделили целый модуль рекурсивному обходу дерева, Python имеет аккуратную функцию walk() это - часть os модуль, и неоднократно возвращает кортеж самого верхнего пути, список всех подкаталогов и список имен файлов. Мы можем сделать следующее:

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

Это могло бы быть намного более опрятно как сценарий:

#!/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 для рекурсивного обхода, и это - дежурный инструмент для задания. То, что действительно должно упомянуть, является фактом это find имеет несколько переключателей командной строки, такой как -printf распечатать вывод в нужном формате, -type f найти только регулярные файлы, -inum искать inode числом, -mtime искать датой модификации, -exec <command> {} \; выполнить конкретную команду для обработки файла с передающим файлом как аргумент (где {} является стандартным find заполнитель для текущего файла), и многие другие поэтому прочитайте страницу справочника для find.

4
ответ дан 14 June 2013 в 00:06

В диспетчере файлов Gnome вы можете щелкнуть значок увеличительного стекла (обычно в правом верхнем углу), а затем начать печатать для поиска в текущей папке.

Для некоторых людей (для меня) это намного проще, чем использование командной строки.

0
ответ дан 19 October 2020 в 11:01

Другие вопросы по тегам:

Похожие вопросы: