Я пытаюсь найти все XML
файлы в определенном каталоге и все подкаталоги (рекурсивно) внутри него.
ls -R *.xml
перечисляет только файлы в текущем каталоге. Я совершенно уверен, что в самих подпапках есть несколько .xml
файлов, но ни один из них не отображается.
Это проблема конфигурации?
Попробуйте использовать Найти
sudo find . -print | grep -i '.*[.]xml'
Вы можете сделать это с помощью , найдите только :
find . -name '*.xml'
.
- текущий каталог. Если вам нужно выполнить поиск в другом каталоге, замените .
на путь к каталогу.
Попробуйте эту команду:
ls -R | grep '.*[.]xml'
ls
не имеет параметров для фильтрации выходных данных. Для этого вам нужно будет использовать трубу. Это передает выходные данные из ls
в grep
, которые затем фильтруют их, чтобы показать только файлы .xml
.
Используя 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 имеет модуль 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 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
.
В диспетчере файлов Gnome вы можете щелкнуть значок увеличительного стекла (обычно в правом верхнем углу), а затем начать печатать для поиска в текущей папке.
Для некоторых людей (для меня) это намного проще, чем использование командной строки.