Bashスクリプトを使用して重複ファイルを見つける

Bashスクリプトを使用して重複ファイルを見つける

同じext4ファイルシステムの現在の作業ディレクトリに同じ内容、権限、および所有者を持つバイナリファイルを繰り返し見つけ、そのファイルへのハードリンクを持つ以前のアクセス時間に置き換えるbashシングルライナーを作成する方法最近アクセスしたファイルとレポートディスク容量はキロバイト単位で節約されますか?

これまでに達成しただけでは、目標を達成するのに十分ではありません。

#! /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

ベストアンサー1

hardlinkすべての要件を満たすことはできませんが、ハードリンクを作成するために使用できます。ディレクトリだけでなくファイル引数も受け入れることができ、常に同じファイルセットを最初のファイルに順番にリンクするようです。また、サイズが0のファイルも無視します。

fdupes必要なものを正確に選択しますが、実際のファイルパラメータを出力するのではなく、同じファイルグループでショートモード出力を出力します。各グループは空行で終わります。

したがって、正確な選択がハードリンクされるようにするには、各段落を個別に呼び出すfdupes必要がありますhardlink。所有者が異なる、または異なる権限を持つ2組の同じオブジェクトが存在する状況を避けてください。もちろん、ファイルに含まれるバイナリファイルはフィルタリングする必要があります。

#!/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削除してください。

また、改行を含むファイル名は処理されないため、スペースを使用したテストは問題ありません。

おすすめ記事