2014-01-29 22 views
1

爲了防止這種情況被關閉,我將問題縮小到了bash腳本中。在網絡共享中使用Bash腳本刪除重複文件

EDITED問題

我運行一個小的網絡,並在備份例行犯了一個錯誤。我每天都有rsync運行,並且它的設置方式是,如果在源上重命名文件夾,則可能會發生備份設備上潛在的重複。

rsync -varz --no-perms --exclude-from=/path/to/exclude_file --log-file=/path/to/rsync_logs

最近用戶做出了不少改變,這導致了很多重複。

我可以用什麼樣的bash腳本策略來攻擊?我嘗試遞歸列表並輸出到文件,並使用diff來比較這些。這使我看到了重複問題的影響。如果我可以使用某種自動化流程來刪除重複項,那將節省我大量的時間。

我開始嘗試這樣的事:

find /mnt/data/ -maxdepth 2 -mindepth 1 -type d -printf '%f\n' > data.txt

和比較:

find /mnt/backup/ -maxdepth 2 -mindepth 1 -type d -printf '%f\n' > backup.txt

我的問題的一個例子是這樣的:

drwxr-xr-x 0 bob staff 0 Jun 25 2009 7-1-08 
drwxr-xr-x 0 bob staff 0 Jun 25 2009 2008-07-01 

這是一個例子備份驅動器,並且這兩個目錄的內容相同。備份包含兩者並且源只有這一個:

drwxr-xr-x 0 bob staff 0 Jun 25 2009 2008-07-01 

這種問題是在整個備份驅動器中。

編輯

我創建了兩個列表,並diff編他們,然後通過手動去了,不甘心的變化。它一點也不像我原先想象的那樣糟糕,一旦我進入它。我在這裏給出了兩個答案(@Mark Pettit和@ebarrere)的+1,因爲我最終使用了每個答案中的作品。在這個實驗過程中,我運行了幾個查找命令,並且最終我也更改了我的rsync腳本,更具體一些。感謝你們。

回答

2

雖然我同意@ Mark的建議修復rsync腳本,但您可以使用findexec來查找重複的文件。類似這樣的:

cd /mnt/data 
find . -type f -exec bash -c "ls /mnt/backup/'{}' &> /dev/null && echo /mnt/backup/'{}'" \; 

會回顯兩個目錄下同一路徑中存在的任何文件。打印的路徑將是備份目錄中的文件。您可以將echo更改爲rm -f以刪除文件,但要小心。

+0

這是一個偉大的小命令。謝謝你的協助。我在幾個子目錄中測試了這個目錄,其中我知道有重複項目存在,並找到它們。我可以手動驗證,所以非常值得信賴。 – nicorellius

3

你應該通過修正你的rsync腳本來解決這個問題,而不是寫一個新的bash腳本。

如果您的源代碼是乾淨的,並且它只是您的備份目標,那麼您可以通過向「rsync」的參數列表中添加「--delete」來輕鬆清理目標。該標誌告訴rsync刪除目標上源上不存在的任何目錄。

+0

謝謝。這是一個好主意,我可以以某種形式使用它,儘管數據太多,可能需要很長時間,並與第二天的活動相沖突......而且,總的來說,我不想使用'--delete'是因爲我不想破壞重要的數據。有一個原因,我設置它不要在目的地刪除。 – nicorellius