同じ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 .)
hardlink
with-n
パラメータは何もシミュレートして書きませんので、上記の内容をそのままテストして後で-n
削除してください。
また、改行を含むファイル名は処理されないため、スペースを使用したテストは問題ありません。