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

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

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

Является ли это проблемой конфигурации?

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

find . -name '*.xml'

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

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

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

Попробуйте выполнить эту команду:

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

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

удар

С помощью globstar опция оболочки, мы можем использовать рекурсивное глобулирование ./**/*

bash-4.3$ shopt -s globstarbash-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

Питон

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

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

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

Вы можете сделать ls -R | grep .xml