簡體   English   中英

比較2個文件夾和查找具有不同字節數的文件

[英]Compare 2 Folders and Find Files with Differing Byte Counts

在Linux Mint 12中使用Gnome,我將一個大約9.7 GB的文件夾(包含一個復雜的子文件夾樹)從一個NTFS閃存驅動器復制到另一個NTFS閃存驅動器。 根據Gnome,文件計數匹配,但根據du(和其他程序),字節計數不匹配。 (我在其他Linux發行版和Windows XP中復制文件夾時遇到了同樣的問題。)

我只想知道哪些文件沒有匹配的字節數。 (我不想比較每個文件的內容,因為這會花費太長時間。)找到字節數不匹配文件的最佳,最簡單和最快的方法是什么?

我會調整@ user1464130的答案,因為它在處理文件名中的空格時遇到了麻煩。

cd dir1
find . -type f -printf "%p %s\n" | sort > ~/dir1.txt
cd dir2
find . -type f -printf "%p %s\n" | sort > ~/dir2.txt
diff ~/dir1.txt ~/dir2.txt

如果要在每個文件上啟動命令並在報告中使用結果,則可以使用while Bash構造。 此示例使用md5sum計算每個文件的校驗和。

find . -maxdepth 1 -type f -printf "%p %s\n" | while read path size; do echo "$path - $(md5sum $path | tr -s " " | cut -f 1 -d " ") - $size" ; done

每個$()都是單獨執行的,允許我們計算每個文件的校驗和。 tr的使用將每個連續的空間擠壓到一個空間中,並且cut在第n個位置提取單詞,這里是第一個位置。 如果我們不這樣做,我們得到文件的名稱兩次,因為md5sum在stdout上給它。

這是一個不使用比較(沒有diff )的例子。 請注意,我使用了破折號-強調我們輸出的關於每個文件的三個數據,但如果您想將其提供給另一個程序則可能會出現問題。

$ find . -maxdepth 1 -name "*.c" -type f -printf "%p %s\n" |  while read path size; do echo "$path - $(md5sum $path | tr -s " " | cut -f 1 -d " ") - $size" ; done
./thread.c - 5f2b7b12c7cd12fcb9e9796078e5d15b - 584
./utils.c - d61bc1dbc72768e622a04f03e3b8f7a2 - 3413

編輯 :並處理文件名中的空格,仍然得到校驗和和大小,您可以使用以下代碼。

$ find . -maxdepth 1 -name "*.c" -type f -print0 | xargs -0 -n 1 md5sum | while read checksum path; do echo $path $(stat --printf="%s" "$path") $checksum ; done
./ini tia li za tion.c 84 31626123e9056bac2e96b472bd62f309

您是否檢查了兩個分區是否具有相同的屬性? (塊大小,大小,刪除或壞塊的保留空間等)

對於您的具體情況,我建議使用選項-n(或--dry-run)進行rsync 它會告訴你哪些文件是不同的。 那是:

$ rsync -I -n /source/ /target/

選項-I是忽略時間。 您可以使用相同的命令使兩個目錄等效(時間戳,權限等)。

查看rsync手冊或嘗試選項--help以獲取有關如何使用它的更多選項和示例。 它非常強大。

假設你需要比較dir1和dir 2,這里是控制台命令:

cd dir1
find . -type f|sort|xargs ls -l| awk '{print $5,$8}' > ~/dir1.txt
cd dir2
find . -type f|sort|xargs ls -l| awk '{print $5,$8}' > ~/dir2.txt
diff ~/dir1.txt ~/dir2.txt

您可能需要編輯awk參數以使其正確打印文件長度和路徑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM