ディレクトリにMD5とXMLの両方があるかどうかを検索または確認するために使用できるbashスクリプトは何ですか?問題は、一部のユーザーがMD5とXMLを送信するのを忘れることがあるということです。ディレクトリにファイルがない場合、ディレクトリは処理されません。次のタスクは満足できません。
while read f; do echo "\"$f\""; done < <(ls -1) >> /tmp/log3
答え1
一対のファイル(1つは「.xml」、もう1つは「.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;
}
または1行で:
perl -e 'print join "\n", grep { not -f s/\.xml$/\.md5/r } glob ( "/path/to/*.xml" )'
どちらも基本的に同じことを行います。
glob
シェルパターンを拡張し、一致するファイルのリストを取得するために使用されますxml
。次に、(sedスタイル)パターン置換を使用して
.xml
拡張子をaに変換します.md5
。このr
フラグは(パターンを変更する代わりに)「この値を返す」という意味なので、インラインでファイル名として使用できます。filetestに渡して
-f
存在することを確認してください。一致するファイルがない場合は、「欠落している」ファイルが印刷されます。
md5 欠落しているXMLをテストするのは非常に簡単です。
frmoのコメントに従って - コンパイルエラーのために./file_list.plの実行が中断されました"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"
。r
これは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