Bash

使用 bash 腳本查找重複文件

  • October 15, 2020

你如何編寫一個 bash 單行程序,它會在同一個 ext4 文件系統上遞歸地從目前工作目錄中找到具有相同內容、權限和所有者的二進製文件,並用硬連結替換所有訪問時間較舊的文件最新訪問的文件和報告以千字節為單位節省的磁碟空間?

到目前為止,我所取得的成就還不足以滿足目標的要求。

#! /bin/sh
fdupes -r -p -o 'time' . | xargs file -i | grep binary | awk '{print $1}' | awk '{print substr($0,3)}' | sed 's/.\{1\}$//' | xargs rdfind -makehardlinks true

hardlink可能無法滿足所有要求,但它可以用於創建硬連結。它可以接受文件參數,不僅是目錄,而且它似乎總是將一組相同的文件按順序連結到第一個文件。它也將忽略零大小的文件。

fdupes準確選擇需要的內容,但不輸出真實的文件參數,而是以段落模式輸出,具有相同文件的組,每個組都以空行結束。

因此,為了確保確切的選擇fdupes將被硬連結,我們必須hardlink每個段落單獨呼叫一次。避免兩對相同的相同對象存在於不同所有者或具有不同權限的情況。當然,必須為二進製文件過濾文件。

#!/bin/bash
unset arr i
while IFS= read -r f; do

   # move file to array if binary
   if file -i "$f" | grep -q "charset=binary"; then
       arr[++i]="$f"
   fi
   
   # if end of paragraph and array has files, hardlink and unset array
   if [[ "$f" == "" && "${arr[@]}" ]]; then
       printf "\n => Hardlink for %d files:\n" "$i"
       hardlink -n -c -vv "${arr[@]}"
       unset arr i
   fi

done < <(fdupes -rpio time .)

hardlinkwith-n參數模擬並且不寫任何東西,所以按原樣測試上面的內容並-n稍後刪除。

也不會處理帶有換行符的文件名,使用空格進行測試似乎沒問題。

引用自:https://unix.stackexchange.com/questions/614182