![在目录中查找匹配的 MD5 和 XML](https://linux22.com/image/99109/%E5%9C%A8%E7%9B%AE%E5%BD%95%E4%B8%AD%E6%9F%A5%E6%89%BE%E5%8C%B9%E9%85%8D%E7%9A%84%20MD5%20%E5%92%8C%20XML.png)
你知道我可以使用什么 bash 脚本来搜索或查明目录是否同时具有 MD5 和 XML 吗?问题是有些用户有时会忘记发送 MD5 和 XML。如果目录中缺少一个文件,则不会处理该目录。下面的工作并不令人满意。
while read f; do echo "\"$f\""; done < <(ls -1) >> /tmp/log3
答案1
假设您正在寻找一对文件 - 一个名为“.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
扩展 shell 模式并获取匹配的文件列表xml
。然后使用(sed 风格)替换模式,将
.xml
扩展名转换为 a.md5
- 该r
标志意味着“返回此值”(而不是修改模式),这样我们就可以将其内联用作文件名...交给
-f
filetest,检查它是否存在。如果没有匹配的文件,则打印“丢失”的文件。
对于 md5 缺失 XML 的测试来说,这应该是非常简单的。
遵循 frmo 评论 - 如果您收到:"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"
由于编译错误而执行 ./file_list.pl 中止” thta 意味着您正在使用不支持r
正则表达式标志的较旧版本的 perl。
这是 2011 年 Perl 5.14 中添加的。
作为解决方法:
my $xml_file = $file;
$xml_file =~ s/\.xml$/\.md5/;
print "MD5 is missing for $file\n" unless -f $xml_file =~ s/\.xml$/\.md5/r;
答案2
我假设您想检测何时丢失文件;要么.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