我有一個高達 700 GB 的資料夾,其中一些檔案是重複的。其中許多具有相同的名稱,有些重複,有些不同。基本上,我在該文件夾旁邊有大約 30 個文件夾,裡面裝滿了文件和更多文件夾。我想遞歸地獲取這個 700 GB 資料夾中的所有文件,並將其非遞歸地複製到另一個目錄。任何衝突將根據大小進行處理。如果兩個文件具有相同的名稱和相同的大小,則跳過該文件,但是,如果兩個文件具有相同的名稱和不同的大小,則保留這兩個文件。我有什麼辦法可以做到這一點嗎?
答案1
問題很複雜,因為受騙者必須重新命名,但也重新命名必須對所有(可能)以前重命名為「夥伴」的受騙者進行大小檢查。
它能做什麼
據我所知(並經過測試),下面的腳本可以做到這一點。它將可能的重複項重新命名為等[dupe_1]<file>
([dupe_1]<file>
如果它們大小不同),並在每次重命名後檢查檔案的大小是否與目標目錄中移動的副本或其重命名的版本相符。
#!/usr/bin/env python3
import shutil
import os
#--- set the directory, the same as the first script
dr = "/path/to/recursive/source_directory"
dr2 = "/path/to/flat/target_directory"
#---
def check_dupe(src, trg):
return os.stat(src).st_size == os.stat(trg).st_size
for root, dirs, files in os.walk(dr):
for file in files:
# define src, target
src = root+"/"+file; trg = dr2+"/"+file
if not os.path.exists(trg):
# if target does not exist: move file
shutil.copy(src, trg)
else:
n = 1
# rename the file, check after every renaming if file exists, if size differs
while os.path.exists(trg):
test = check_dupe(src, trg)
if test != True:
trg = dr2+"/[dupe_"+str(n)+"]"+file
n += 1
else:
break
if test != True:
shutil.copy(src, trg)
如何使用
- 將腳本複製到一個空文件中,另存為
reorganize.py
- 在腳本的頭部,設定來源目錄和目標目錄的路徑
透過命令運行它:
python3 /path/to/reorganize.py
筆記
- 請先小樣本測試
- 請記住,這可能會創建一個巨大的「flat」目錄,nautilus 無法瀏覽目錄。
答案2
嘗試這個:
cd [folder_name]
for file in ./*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*
do
if [ -e [destination_folder]/"$file" ]; then
if [ `du -s "$file" | cut -d ' ' -f 1` -eq `du -s [destination_folder]/"$file" | cut -d ' ' -f 1` ]; then
false
else
cp "$file" [destination_folder]/"$file"...
fi
else
cp "$file" [destination_folder]/
fi
echo "$file copied"
done