サブディレクトリに再帰的にファイルを検索する方法


117

XML特定のディレクトリ内のすべてのファイルとその中のすべてのサブディレクトリ(再帰的に)を検索しようとしています。

ls -R *.xml現在のディレクトリ内のファイルのみをリストします。サブフォルダ自体にはいくつかの.xmlファイルがありますが、表示されているものはありません。

これは構成の問題ですか?


2
できることls -R | grep .xml
ニコス

回答:


90

検索を使用してみてください

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

4
sudoは必須ですか、それともスーパーユーザー権限を確保するためにありますか?
シャミムハフィズ

4
決めさせてください。 須藤ない須藤
ミッチ

6
ただ興味がありません。findover の利点は何ls -Rですか?
don.joey

1
@ don.joeyこれは、stackoverflow.com
Mitch

10
-1混合するfindgrep、ときfind正規表現とグロブの両方を使用してフィルタリングを行うことができ、かつ使用していないfind-print0とgrepさん-z、あなたが混在する必要がないとき。

147

あなたはそれだけで見つけることができます:

find . -name '*.xml'

.現在のディレクトリです。別のディレクトリで検索する必要がある場合.は、ディレクトリパスに置き換えます。


2
現在のディレクトリをルートとするディレクトリで必要なファイルを再帰的に検索します。私の場合、現在のディレクトリのみをチェックし、サブディレクトリはチェックしませんでした。
モスタフィズラーマン14

1
@mostafiz、「*。xml」の部分を引用する必要があります。答えを編集します。
KaeruCT

1
実際.php、現在のディレクトリでファイルを検索しました。しかし.php、現在のディレクトリのファイルのみを返し、サブディレクトリで再帰的に検索しませんでした。だからこそ、findコマンドを再帰的に検索するかどうかを尋ねています。
モスタフィズラーマン14年

3
@mostafiz、findコマンドは再帰的に検索します。パラメータを引用しない場合、シェルはで拡張を行う可能性がある*ため、現在のディレクトリ内のファイルと一致します。
KaeruCT

大丈夫!間違いを犯したかもしれません。今では完璧に機能しています!
モスタフィスラーマン14

13

このコマンドを試してください:

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

ls出力をフィルタリングするオプションはありません。そのためには、パイプを使用する必要があります。これはからlsへの出力を渡し、ファイルgrepをフィルタリングして.xmlファイルのみを表示します。


5
とにかくこれを取得して、元のディレクトリを表示するには?
AdamO


4

バッシュ

使用してglobstarシェルオプションを、私たちは、再帰グロブを利用することができます./**/*

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、再帰的なトラバーサルについて言及しており、それが仕事の頼りになるツールです。言及する必要があるのは、目的の形式で出力を印刷する、通常のファイルのみを見つける、inode番号で検索する、変更日で検索する、特定のコマンドを実行してファイルを処理するfindなど、複数のコマンドラインスイッチがあるという事実です引数としてファイルを渡す方法(現在のファイルの標準プレースホルダー)、および他の多くのファイルについては、のマンページを参照してください。-printf-type f-inum-mtime-exec <command> {} \;{}findfind

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.