Tente usar Localizar
sudo find . -print | grep -i '.*[.]xml'
Estou tentando procurar todos os arquivos XML
em um diretório específico e todos os subdiretórios (recursivamente) dentro dele.
ls -R *.xml
está listando apenas arquivos no diretório atual. Tenho certeza de que as subpastas têm vários arquivos .xml
, mas nenhum está aparecendo.
Este é um problema de configuração?
Você pode fazer isso com somente :
find . -name '*.xml'
.
é o diretório atual. Se você precisar procurar em outro diretório, substitua .
pelo caminho do diretório.
Experimente este comando:
ls -R | grep '.*[.]xml'
ls
não tem opções para filtrar a saída. Para isso você precisaria usar pipe. Isso passa a saída de ls
para grep
, que então os filtra para mostrar apenas os arquivos .xml
.
Usando a opção globstar
shell, podemos fazer uso de globalização recursiva ./**/*
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
O Perl tem um módulo Find
, que permite a travessia recursiva da árvore de diretórios. Dentro da função especial find()
, podemos definir uma sub-rotina desejada e o diretório que queremos percorrer, neste exemplo que é .
. O one-liner, nesse caso, seria:
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
Enquanto o Perl tem um módulo inteiro dedicado à travessia de árvore recursiva, o Python possui uma função pura walk()
que é parte do os
module, e repetidamente retorna tupla do caminho mais alto, lista de todos os subdiretórios e lista de nomes de arquivos. Nós podemos fazer o seguinte:
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
Isso pode ser muito mais simples como um 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))