Backup
列出所有存在於 backup2.tar.bz2 但不存在於 backup1.tar.bz2 中的文件
這列出了兩個備份中的所有文件,按大小排序:
tar tvf backup1.tar.bz2 |sort -k3 -n >backup1_files.txt tar tvf backup2.tar.bz2 |sort -k3 -n >backup2_files.txt
我想列出所有存在於 backup2.tar.bz2 但不存在於 backup1.tar.bz2 中的文件,按大小排序。
這該怎麼做?
注意:
- 執行
diff
這些 .txt 文件中的一個將不起作用,因為某些文件的修改日期不會相同。因此,這個問題與Is there a tool to get the lines in a file that are not in another? 不重複?.- 刪除
v
會刪除修改日期,還會刪除文件大小,所以這不是一個選項,因為不可能按大小對它們進行排序。
如果你有 AWK,你可以像這樣使用一個襯裡:
awk '{if (NR==FNR) { arr[$6]=1 } else { if (! arr[$6]) { print } } }' backup2_files.txt backup1_files.txt
這將使用備份 2 的文件名建構一個 AWK 數組,然後檢查該數組中是否存在備份 1 的文件名。如果沒有,它將列印它們。
編輯:這是一個改進的版本,它對名稱中帶有空格的文件更加健壯,並且不需要任何臨時文件:
awk '{ key=""; for (i = 6; i <= NF; i++) { key=col_cat $i }; if (NR == FNR) { arr[key]=1 } else { if (! arr[key]) { print } } }' <(tar tvf backup2.tar.bz2 |sort -k3 -n) <(tar tvf backup1.tar.bz2 |sort -k3 -n)
您可以將 awk 程式碼寫入文件
intersect.awk
中,然後像這樣重複使用它:awk -f intersect.awk <(tar tvf backup2.tar.bz2 |sort -k3 -n) <(tar tvf backup1.tar.bz2 |sort -k3 -n)