Поиск совпадающих MD5 и XML в каталоге

Первая сортировка входного файла и уникальных (-u) строк в первых двух столбцах -k1 ,2 и вырезать третий столбец.

Затем переберите строки в pattern и соберите третий столбец (sed) из входного файла. Наконец, удалите разрывы строк tr и напечатайте совпадения.

pattern=$(sort -k1,2 -u < file | cut -d' ' -f1-2) 
while read -r line
do
 collect=$(sed -n 's/^'"$line"'//p' file | tr '\n' ' ')
 echo "$line $collect"
done <<<"$pattern"
1
20.11.2016, 13:35
2 ответа

Предполагая, что вы ищете пары файлов - один с именем '.xml', а другой с именем '.md5', я бы занялся этим следующим образом:

#!/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;
}

Или как один лайнер:

perl -e 'print join "\n", grep { not -f s/\.xml$/\.md5/r } glob ( "/path/to/*.xml" )'

Оба делают в основном одно и то же

  • используют glob , чтобы развернуть шаблон оболочки и получить соответствующий список файлов из xml файлов.

  • Затем используйте шаблон замены (стиль sed), чтобы преобразовать расширение .xml в .md5 - флаг r означает «вернуть это значение. '(вместо того, чтобы изменять шаблон), чтобы мы могли использовать его в качестве имени файла ...

  • для передачи -f filetest, чтобы проверить, существует ли он.

  • А затем распечатайте «отсутствующие» файлы, если подходящего нет.

Это должно быть довольно тривиально для адаптации к тесту на отсутствие XML для md5.

Следуя комментариям frmo - если вы получаете: «Неизвестное слово найдено там, где ожидался оператор в строке 6 ./file_list.pl, рядом с синтаксической ошибкой« s / \. Xml $ / \. Md5 / r »в ./file_list.pl строка 6, рядом с "s / \. xml $ / \. md5 / r" Выполнение ./file_list.pl прервано из-за ошибок компиляции "это означает, что вы используете старую версию perl который не поддерживает флаг r для регулярного выражения.

Это было добавлено в Perl 5.14 в 2011 году.

В качестве временного решения:

my $xml_file = $file;
   $xml_file =~ s/\.xml$/\.md5/; 
print "MD5 is missing for $file\n" unless -f $xml_file =~ s/\.xml$/\.md5/r;
0
28.01.2020, 01:07

Я предполагаю, что вы хотите обнаружить отсутствие файлов; либо отсутствует файл .md5, либо отсутствует файл .xml.

Циклический просмотр шаблонов *.md5и *.xmlпо очереди и обнаружение соответствующего файла «другого типа»:

#!/bin/sh

for name in./*.md5; do
    if [ ! -e "${name%.md5}.xml" ]; then
        printf '"%s" is missing its XML file\n' "$name"
    fi
done

for name in./*.xml; do
    if [ ! -e "${name%.xml}.md5" ]; then
        printf '"%s" is missing its MD5 file\n' "$name"
    fi
done

Расширение ${variable%word}расширится до значения $variable, с (кратчайшей )строкой, соответствующей word, удаленной из его конца. Мы используем его здесь, чтобы удалить известный суффикс имени файла из значения переменной цикла. Затем мы добавляем другой суффикс к значению переменной и проверяем, является ли это именем существующего файла. В противном случае печатается соответствующее сообщение.

Проверка:

$ touch file{1..5}.xml file{2..7}.md5
$ ls
file1.xml file2.xml file3.xml file4.xml file5.xml file7.md5
file2.md5 file3.md5 file4.md5 file5.md5 file6.md5 script
$ sh script
"./file6.md5" is missing its XML file
"./file7.md5" is missing its XML file
"./file1.xml" is missing its MD5 file
0
14.05.2021, 22:11

Теги

Похожие вопросы