Você já tem algumas respostas sólidas, mas eu ofereço uma alternativa - a especificação XML é bastante rigorosa, e arquivos que não começam com <
não são realmente XML .
Portanto, uma abordagem simples pode ser simplesmente testar se o arquivo é 'válido' ou não. Todos os analisadores XML podem fazer isso, mas aqui está um exemplo:
#!/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 $@;
}
Isso pode preencher o formulário como:
perl -MXML::Twig -e 'foreach ( @ARGV ) { eval { XML::Twig -> new -> parsefile ( $_ ) }; print "File: $filename is not valid XML $@\n" if $@;' *.xml
Se a travessia recursiva for importante, então File::Find
também ajudará:
#!/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, "." );
Isso detectará qualquer 'XML incorreto', que incluirá os arquivos que você especificou na sua pergunta.