古いファイルと新しいファイルを比較しますが、新しいファイルにのみ存在する行を無視しますか?

古いファイルと新しいファイルを比較しますが、新しいファイルにのみ存在する行を無視しますか?

2つのファイルがあります。

  1. oldlist- これには、ファイルのリストと各ファイルのmd5ハッシュが含まれます。これは1年前に生成されました。
  2. 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

関連情報