"<"で始まらないすべてのxmlファイルをgrepする方法

現在のディレクトリと存在しないすべてのサブディレクトリからすべてのxmlファイルを見つける方法から始まる <最初の行に。

私はこれを試しましたがうまくgrepいきません:

find . -type f -name '*.xml' | grep "^[^<]" | head -n 1

ベストアンサー1

すでにいくつかの明確な答えがありますが、代替案を提示しましょう。 XML仕様は非常に厳格で、ファイルはいいえstart withは<実際にはまったくXMLではありません。

したがって、簡単なアプローチは、ファイルが「有効」であるかどうかをテストすることです。すべてのXMLパーサーはこれを実行できますが、例は次のとおりです。

#!/usr/bin/perl
use strict;
use warnings; 
use XML::Twig;

foreach my $filename ( @ARGV ) { 
    eval { XML::Twig -> new -> parsefile ( $filename ); };
    print "File: $filename is not valid XML $@\n" if $@;
}

これは次のように1行にまとめることができます。

perl -MXML::Twig -e 'foreach ( @ARGV ) { eval { XML::Twig -> new -> parsefile ( $_ ) }; print "File: $filename is not valid XML $@\n" if $@;' *.xml

再帰巡回が重要な場合にもFile::Find便利です。

#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;
use File::Find;

sub check_valid_xml {
    #skip any files that don't end in '.xml'
    next unless m/\.xml$/;   
    #validate this file
    eval { XML::Twig->new->parsefile($File::Find::name); };
    #report errors if detected - parser will abort on invalid XML
    if ($@) { print "File $File::Find::name is not valid XML $@"; }
}

find( \&check_valid_xml, "." );

これは感知するどの質問に指定したファイルを含む「無効なXML」です。

おすすめ記事