web-dev-qa-db-ja.com

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

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

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

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

113
Shamim Hafiz

Find を使用してみてください

Sudo find . -print | grep -i '.*[.]xml'
88
Mitch

find のみでそれを行うことができます:

find . -name '*.xml'

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

146
KaeruCT

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

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

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

13
Rohit Jain

bash

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にはosモジュールの一部であるきちんとした関数walk()があり、最上位パスのタプル、すべてのリストを繰り返し返しますサブディレクトリ、およびファイル名のリスト。次のことができます。

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 iノード番号で検索、-mtimeで変更日を検索、-exec <command> {} \;で特定のコマンドを実行し、引数としてファイルを渡してファイルを処理します({}は標準findプレースホルダー現在のファイルの場合)、および他の多くのファイルの場合は、findのマンページを参照してください。

3