Supondo que você esteja procurando por pares de arquivos - um chamado '.xml' e outro chamado '.md5', eu o colocaria assim:
#!/usr/bin/env perl
use strict;
use warnings;
foreach my $file ( glob ( "/path/to/dir/*.xml" ) ) {
print "MD5 is missing for $file\n" unless -f $file =~ s/\.xml$/\.md5/r;
}
Ou como um folheto:
perl -e 'print join "\n", grep { not -f s/\.xml$/\.md5/r } glob ( "/path/to/*.xml" )'
Ambos fazem basicamente a mesma coisa
-
use
glob
para expandir um padrão de shell e obter uma lista de arquivos correspondente dexml
files. -
Em seguida, use um padrão de substituição (estilo sed) para transformar a extensão
.xml
em.md5
- o sinalr
significa 'retornar este valor' (em vez de modificar o padrão) para que possamos use-o como um nome de arquivo ... -
para entregar a
-f
filetest, para verificar se existe. -
E, em seguida, imprima os arquivos "ausentes" se não houver um correspondente.
Isso deve ser bem trivial para se adaptar ao teste de XML ausente para md5s também.
Seguindo os comentários frmo - se você está recebendo: "Bareword found where operator expected at ./file_list.pl line 6, near "s/\.xml$/\.md5/r" syntax error at ./file_list.pl line 6, near "s/\.xml$/\.md5/r"
Execução de ./file_list.pl abortada devido a erros de compilação "thta significa que você está usando uma versão antiga do perl que não suporta o r
sinalizar para regex.
Isso foi adicionado em perl 5,14 em 2011.
Como solução alternativa:
my $xml_file = $file;
$xml_file =~ s/\.xml$/\.md5/;
print "MD5 is missing for $file\n" unless -f $xml_file =~ s/\.xml$/\.md5/r;