Files

比較兩個文件夾中的缺失文件

  • October 3, 2021

我有兩個不同的文件夾,每個文件夾都有相同的文件名,但一個有失去的文件。我如何能夠比較這兩個文件夾Folder1Folder2列出Folder2其中Folder1包含的缺失文件。

$ tree
.
|-- dir1
|   |-- file1
|   |-- file2
|   |-- file3
|   |-- file4
|   `-- file5
`-- dir2
   |-- file2
   |-- file4
   `-- file5

2 directories, 8 files
$ for f1 in dir1/*; do f2="dir2/${f1#dir1/}"; [ ! -e "$f2" ] && printf '%s\n' "$f2"; done
dir2/file1
dir2/file3

這將遍歷第一個目錄中的所有名稱,並為每個名稱創建預期存在於第二個目錄中的文件的相應名稱。如果該文件不存在,則列印其名稱。

循環寫得更詳細(並且使用basename​​而不是參數替換從第一個目錄中文件的路徑名中刪除目錄名):

for f1 in dir1/*; do
   f2="dir2/$( basename "$f1" )"
   if [ ! -e "$f2" ]; then
       printf '%s\n' "$f2"
   fi
done

如果兩個目錄下的文件不僅名字相同,而且內容也一樣,你可以使用diff(注意:diff這裡用的是BSD,GNUdiff可能會說別的):

$ diff dir1 dir2
Only in dir1: file1
Only in dir1: file3

如果同名文件的文件內容不同,那麼這顯然會輸出很多可能不感興趣的附加數據。 diff -q在這種情況下可能會安靜一點。

另請參閱diff系統上的手冊。


為了比較更深層次的層次結構,您可能需要使用rsync

$ rsync -r --ignore-existing -i -n dir1/ dir2
>f+++++++++ file1
>f+++++++++ file3

上面將為每個文件輸出一行,該文件下dir1沒有對應的文件dir2-n選項 ( )--dry-run確保實際上沒有文件傳輸到dir2.

-r選項 ( --recursive) 使操作遞歸,( -i)--itemize-changes選擇特定的輸出格式(>f加號和加號表示該文件是接收端的新文件)。

另見rsync手冊。

引用自:https://unix.stackexchange.com/questions/524074