特定のディレクトリ内のすべてのXML
ファイルとその中のすべてのサブディレクトリ(再帰的に)を検索しようとしています。
ls -R *.xml
は、現在のディレクトリ内のファイルのみをリストしています。サブフォルダ自体にはいくつかの.xml
ファイルがありますが、表示されるものはありません。
これは構成の問題ですか?
Find を使用してみてください
Sudo find . -print | grep -i '.*[.]xml'
このコマンドを試してください:
ls -R | grep '.*[.]xml'
ls
には、出力をフィルタリングするオプションがありません。そのためには、パイプを使用する必要があります。これにより、出力がls
からgrep
に渡され、.xml
ファイルのみを表示するようにフィルターされます。
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には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には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
のマンページを参照してください。