Files
比較兩個文件夾中的缺失文件
我有兩個不同的文件夾,每個文件夾都有相同的文件名,但一個有失去的文件。我如何能夠比較這兩個文件夾
Folder1
並Folder2
列出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
手冊。