Vraag Zoeken naar bestanden recursief in submappen


Ik probeer alles te vinden XML bestanden in een bepaalde map en alle submappen (recursief) erin.

ls -R *.xml is alleen een lijst met bestanden in de huidige map. Ik ben er vrij zeker van, de submappen zelf hebben er verschillende .xml bestanden, maar er verschijnen er geen.

Is dit een configuratieprobleem?


90
2018-06-13 20:06


oorsprong


Je kunt doen ls -R | grep .xml - Nik-Lz


antwoorden:


Probeer het te gebruiken Vind

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

68
2018-06-13 20:16



is de sudo-must, of is het er om supergebruikersrechten te garanderen? - Shamim Hafiz
Ik liet je beslissen. sudo, Geen Sudo. - Mitch♦
Gewoon uit interesse. Wat is het voordeel van find over- ls -R? - don.joey
@ don.joey Dit kan helpen stackoverflow.com/questions/13830036/... - Mitch♦
-1 voor mixen find en grep, wanneer find kan filteren met beide regexes en klodders, en niet gebruiken find's -print0 en grep's -z wanneer je moet mixen. - muru


Je kunt het doen met vind enkel en alleen:

find . -name '*.xml'

. is de huidige map. Als u in een andere map moet zoeken, vervangt u . met het directorypad.


119
2018-06-13 20:22



Zoekt het naar het vereiste bestand recursief in de map geroot in de huidige map. In mijn geval controleerde het gewoon in de huidige directory, checkte de submap niet. - mostafiz rahman
@mostafiz, je moet het gedeelte '* .xml' citeren. Ik zal mijn antwoord bewerken. - KaeruCT
Ik zocht eigenlijk naar .php bestanden in de huidige map. Maar het kwam alleen terug .php bestanden in de huidige map, niet recursief in submappen gezocht. Dat is waarom ik vraag of find commando's zoeken recursief of niet. - mostafiz rahman
@mostafiz, de find commando zoekt recursief. Als je de parameter niet citeert, denk ik dat je shell een uitbreiding op de *, zodat het overeenkomt met de bestanden in de huidige map. - KaeruCT
Okee! Misschien heb ik een vergissing gemaakt. Nu werkt het perfect! - mostafiz rahman


Probeer deze opdracht:

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

ls heeft geen opties om de uitvoer te filteren. Daarvoor zou je pijp moeten gebruiken. Dit geeft de uitvoer door ls naar grep, die ze vervolgens filtert om alleen de .xml bestanden.


11
2018-06-13 20:10



Hoe dan ook om dit te krijgen om de map te tonen waar het vandaan kwam? - AdamO
Verplichte link: Waarom niet ontleden ls? - Ruslan


bash

Gebruik makend van globstar shell-optie, kunnen we gebruik maken van recursieve 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 heeft een module Find, waardoor recursieve directory tree traversal mogelijk is. In de special find() functie, kunnen we een gewenste subroutine en de map die we willen doorlopen definiëren, in dit voorbeeld is dat .. De one-liner in dergelijke gevallen zou zijn:

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

Terwijl Perl een hele module heeft die zich toelegt op het recursieve boombewegingsproces, heeft Python een nette functie walk() dat is een deel van os module, en retourneert herhaaldelijk tuple van het bovenste pad, een lijst met alle submappen en een lijst met bestandsnamen. We kunnen het volgende doen:

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

Dit is misschien veel netter als een 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))

1
2017-07-13 02:43