2010-01-07 70 views
210

我有兩個目錄具有相同的文件列表。我需要使用diff命令來比較兩個目錄中的所有文件。是否有一個簡單的命令行選項來完成它,還是必須編寫一個shell腳本來獲取文件列表,然後遍歷它們?差異文件存在於兩個不同的目錄中

回答

293

您可以使用該diff命令:

diff -bur folder1/ folder2/ 

這將輸出一個遞歸DIFF無視空間,用統一的背景:

  • b標誌意味着忽略空白
  • ü標誌意味着一個統一的環境(3條線之前和之後)
  • [R標誌意味着遞歸
+4

在Windows中,你用什麼來作出這樣的diff命令? – onmyway133 2013-02-26 10:09:48

+8

您可以通過下載[GNU utilities for Win32](http://unxutils.sourceforge.net/)來訪問'diff'命令。 – 2013-02-26 13:32:08

+6

我也發現--brief選項很有用;你會得到已更改文件的列表,並可以分別處理它們 – Dariusz 2013-04-03 12:44:35

9

diff不僅可以比較兩個文件,它可以通過使用-r選項來遍歷整個目錄樹,遞歸地檢查每個樹中可比較點發生的子目錄和文件之間的差異。

$ man diff 

... 

-r --recursive 
     Recursively compare any subdirectories found. 

... 
16

差異有一個選項-r這意味着要做到這一點。

diff -r dir1 dir2

3

如果它是GNU的diff,那麼你就應該能夠在兩個目錄指向它並使用-r選項。

否則,請嘗試使用

for i in $(\ls -d ./dir1/*); do diff ${i} dir2; done 

注:正如Dennis在評論部分指出的那樣,你實際上並不需要在ls上進行命令替換。我一直這樣做了很長時間,我幾乎在自動駕駛儀上這樣做,並用我需要的命令來獲取我的文件列表進行比較。

另外我忘了補充說我暫時禁用我的別名ls到GNU ls,這樣我就失去了GNU ls返回的列表中的顏色格式信息。

+2

沒有必要使用'ls':'爲我in。/ dir1/*' – 2010-01-07 12:17:13

+1

@ Dennis,時髦的捷徑。 +1。我很習慣做命令替換,雖然它是自動的,我只是使用我需要的任何命令,例如有時我正在使用find。使用ls也可以讓我玩更多的dir列表,例如反向時間而不是默認順序。 – 2010-01-07 12:49:59

72

如果你只看到不同的文件感興趣,你可以使用:

diff -qr dir_one dir_two | sort 

選擇「Q」將只顯示不同的是不同的文件,而不是內容,和「排序」將按字母順序排列輸出。

+1

太棒了!也有效地工作 - 即,如果整個子目錄僅存在於其中一個目錄中,則其停止重複進入並且僅報告子目錄本身(沒有其後續內容)。非常好!! – SomethingSomething 2015-03-26 09:17:00

+0

'-q'選項man!我愛你。 – Campa 2017-11-23 09:20:35

0

以下是顯示兩個文件夾中文件差異的腳本。它遞歸地工作。更改dir1和dir2。

(search() { for i in $1/*; do [ -f "$i" ] && (diff "$1/${i##*/}" "$2/${i##*/}" || echo "files: $1/${i##*/} $2/${i##*/}"); [ -d "$i" ] && search "$1/${i##*/}" "$2/${i##*/}"; done }; search "dir1" "dir2") 
0

試試這個:

diff -rq /path/to/folder1 /path/to/folder2  
+0

這複製了一個現有的答案,並沒有添加任何新內容。除非你真的有新的東西來貢獻,否則請不要發佈答案。 – 2017-06-06 21:35:09

相關問題