2つのファイルがあります。
oldlist
- これには、ファイルのリストと各ファイルのmd5ハッシュが含まれます。これは1年前に生成されました。newlist
- ファイルリストと各ファイルのmd5ハッシュも含まれています。ただし、一部のファイルが変更され(例:md5ハッシュが異なる)、いくつかの新しいファイルが追加されました。
oldlist
との間のすべての違いを確認したいが、newlist
に存在しないファイルは無視したいと思いますoldlist
。
つまり、新しいファイルには興味がありません。前の各ファイルのmd5ハッシュを比較して、昨年変更されたファイルがあるかどうかを確認したいと思います。
答え1
使用join
両方のファイルで一致する行をマージします。ファイル名が(出力に示されているように)チェックサムの後にあり、空白がないと仮定するmd5sum
と、前のチェックサムと新しいチェックサムとともに、2つのリストのすべてのファイル名が印刷されます。
join -1 2 -2 2 <(sort -k 2 oldlist) <(sort -k 2 newlist)
新しいファイルも表示するには、-a
オプションをに渡しますjoin
。一部の出力後処理では、チェックサムは変更されていないファイル名を削除します。
join -a 2 -1 2 -2 2 <(sort -k 2 oldlist) <(sort -k 2 newlist) |
awk '$2 != $3'
答え2
これは一人で行うことができますawk
。
$ awk 'FNR==NR { o[$2]=$1; next } !o[$2] { print $0, "NEW"; next }
$1!=o[$2] { print $0, "CHANGED" }' newlist oldlist
(仮定されたファイル形式はmd5sum
出力形式:「md5ファイル名」です。)
修正するawk
:この1行のコードがどのように機能するかを段階的に説明します。
awk 'FNR==NR { # if current record number==overall record number (still processing the first file)
o[$2]=$1 # store the record in array o: the key is the file name, the value is the md5
next # go to next record (do not execute the rest of the code)
}
# reaching this point means we are processing the second input file
!o[$2] { # if array o not contains item with the current record`s file name
print $0, "NEW" # print the current record and specify that it`s new
next # go to next record (do not execute the rest of the code)
}
# reaching this point means array o contains item with the current file name
$1!=o[$2] { # if the current md5 is not equal with the md5 save for the current file name
print $0, "CHANGED" # print the current record and specify it`s changed
}' newlist oldlist
答え3
あなたの質問を正しく理解したら、comm
あなたが望むことを実際に行うことが可能です。私はそれを調べてみることを提案します。comm --help
具体的に
-1 suppress column 1 (lines unique to FILE1)
-2 suppress column 2 (lines unique to FILE2)
-3 suppress column 3 (lines that appear in both files)
だからcomm newFile oldFile -1 -3
あなたがしたいことをします。
答え4
代わりに、私はいつも " sdiff -s
"を使ってファイルリストまたはmd5sumを比較します。
ファイルが正常であると仮定すると、md5sumは " md5hash filename
"を出力します。それから:
sdiff -s oldfile newfile | grep -v ">"
# sorting on the md5hash should help align and pick up renamed files.
sdiff -s <(sort oldfile) <(sort newfile)
これを破るには::
sdiff -s
共通の行を抑制するので、正確な一致は無視されます。|
、の違いを見てください<
。 :このコマンドがsdiffの前にソートされるかどうか。 :新しいファイルエントリを無視します。 filenameに何もない場合にのみ機能します。これはとにかく不可能です。>
<(sort oldfile)
grep -v ">"
>
sdiff
より長い線を表示するように幅を変更できます-w 100
。