リカバリ後のタスク

提供: ArchWiki
2023年4月6日 (木) 16:43時点におけるKusanaginoturugi (トーク | 投稿記録)による版 (add en page link.)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

関連記事

ノート: 回復または復元されたファイルへのアクセスを高速化するために、shake ユーティリティを使用してデフラグメンテーションすることができます。

チェックサムで一意なファイルのみをリストする

ノート:
  • photorec が元の名前を復元できるファイルのみをリストするには、awkprint の前に if(index(A,"_") != 0) を追加します。すでに作成されたファイルで単独のファイル名または拡張子のみをリストする場合は、awk をスタンドアロンコマンドとして使用することもできます。
  • 拡張子のみをリストする場合は、awkD=B;gsub(/[^.]./,"",D) を使用することができます。これにより、tar.gz 拡張子から gz のみを表示することができます。また、ファイル名の最初のドットまでをカットする gsub の代わりに sub を使用することもできます。

ファイルが復元されると、多くのファイルが同じ ハッシュ値 を持つ場合があります。重複するファイルの1つだけを含む一意のファイルのリストを作成することで、他のユーティリティを使用してファイルに関する追加情報を収集する際に、保存されたファイル名とパスを使用して高速化できます。

find -type f -print0 | \
 xargs -0  md5sum | \
 awk '// {Count[$1]++;
 if( Count[$1] == 1 ){C=substr($0,index($0,"./"));A=$0;sub(/^.*\//,"",A);B=substr(A,index(A,"_")+1);HASHsum=$1;
 print A"|"B"|"C"|"HASHsum}}' 
 

これにより、画面に以下のパターンで結果が表示されます: filename|restored_filename|full_path_to_filename|check_sum

f851733136_WindowMaker_Dockapps.pdf|WindowMaker_Dockapps.pdf|./f851733136_WindowMaker_Dockapps.pdf|272cc4fcdc8027e3b8b53318f08f3f01

ファイル名を整理して並べる

宛先のファイル名をより bash に使いやすくするために、特殊な記号やスペースを削除し、重複した名前を持つファイルのよりよい概要のために2番目の列でソートすることができます。重複したファイル名には、restored_filename の前に ¤ を区切り記号として加えられます。スクリプトは、上記で作成したスクリプトによって作成されたファイルを使用し、結果を stdout に出力します。

clean_and_sort.sh
if [ ! -z "$1" ];then
  awk -F"|" '{B=$2;
   gsub(/\(/,"",B);gsub(/\)/,"",B);
   gsub(/!/,"",B); gsub(/?/,"",B);
   gsub(/\[/,"",B);gsub(/\]/,"",B);
   gsub(/{/,"",B); gsub(/}/,"",B);
   gsub(/&/,"",B); gsub(/=/,"",B);
   gsub(/\^/,"",B);gsub(/~/,"",B);
   gsub(" ","",B) ;gsub(/#/,"",B);
   gsub(/\"/,"",B);gsub(/;/,"",B);
   gsub(/\\/,"",B);gsub(/\//,"",B);
   sub(/-*/,"",B); sub(/+*/,"",B);
   print $1" | "B" | "$3}' "$1" | \
  sort --field-separator=\| -s -d -k 2  \
awk -F'|' '{B=$2;Count[B]++;sub(/ */,"",B);if( Count[$2] == 1 ){print $1"|"B"|"$3}else{print $1"|"Count[$2]-1"¤"B"|"$3"|"$4} }'
else echo 'Path to file is missing!'
fi

ファイル名に特殊記号が含まれている場合、特にそれらがファイル名の先頭にある場合は、クォートやバックスラッシュ を使用しないと、mvcp のようなコマンドで管理するのが難しくなりますが、それらをすべて削除する代わりに、HTML hex codes で置き換えることができます。

Photorec

配列のデータを含むファイルの作成

この例では、xdg-mime を使用して mime タイプに関する情報を収集していますが、file --mime-type -bfile -i -b コマンドは xdg-mime query filetype コマンドと同じ出力を提供しますが、より詳細な情報を提供することもあります。このスクリプトは、info-mime-size-db.txt にファイルの追加情報を多数収集します。スクリプトを photorec で使用した宛先ディレクトリに配置し、宛先ディレクトリ内のユニークなチェックサムのリストからのファイルへのパスを使用して実行します。例:awk -F" | " '{system("start-collect-file-info.sh "$3" "$1" "$2)}' file_list-unique_checksums

start-collect-file-info.sh
#!/bin/bash
if [ ! -z "$1" ] && [ ! -z "$2" ] && [ ! -z "$3" ]; then
if [ -f "$1"  ]; then
echo "$1"
echo "$(file "$1" -F"|"  )'|'$(xdg-mime query filetype "$1")'|'$(du -h "$1" |awk '{print $1}' )|$2|$3" >> info-mime-size-db.txt
else
echo The « "$1" » is not a valid file name.
fi
fi

このスクリプトは、path to file/file name | info about the file | mime type | size | filename | restored_filename のパターンでファイルを作成します。以下に例を示します:./recup_dir.1/f872690288_image.jpg|JPEG image data, JFIF standard 1.01|image/jpeg|24K|f872690288_image.jpg|image.jpg

リカバリ後のタスク

このスクリプトは、path to file/file name | info about the file | mime type | size | filename | restored_filename のパターンでファイルを作成します。以下に例を示します: ./recup_dir.1/f872690288_image.jpg|JPEG image data, JFIF standard 1.01|image/jpeg|24K|f872690288_image.jpg|image.jpg

警告:

echo コマンドを cpmkdir の前から削除してください。そうしないと、スクリプトは実際に何も復元せず、宛先に何が行われるかを示すだけになります。 echo コマンドを使って、ファイル名や宛先の設定が正しく表示されていることを確認するのは良い方法です。

これらのスクリプトは、 photorec で作成されたフォルダからファイルを復元するための例です。注意してください!

スクリプトの先頭

現在のディレクトリに info-mime-size-db.txt が存在するかどうかを簡単に確認する方法は以下の通りです。スクリプトの残りの部分で可能なエラーを防ぐためです。

#!/bin/bash
if [ -f info-mime-size-db.txt ]; then echo The file info-mime-size-db.txt exists continuing... ;
  else 
  echo Error!! the info-mime-size-db.txt file cannot be found;exit 1; 
fi

変数の開始

CountAll="0"
CountToLimit="0"
BaseSubDirName="MyRestoredFiles"
Destination="$HOME/NameOfBaseFolder/${BaseSubDirName}-MoreDetailsInFolderName/"
NewDirNumber="0"
CountToLimit="0"

配列にデータを追加

警告: 配列は info-mime-size-db.txt ファイルからデータを読み込むことで追加されます。そうでない場合、スクリプトは正しく動作しません!
while ループを使った方法

ここでは、awkgrep、および sed の代わりに bash standard expressions を使用して、ファイルからパターンを持つ配列を高速化する方法について簡単な例を示します。ArrayOfFiles 配列にはファイルへの完全なパスが含まれ、ArrayOfsorted には photorec によって復元された元の名前が含まれますが、ランダムに生成された部分は含まれません。

WhileArray=0;
while read i; do
if [[ "$i" =~ "gif" ]]||[[ "$i" =~ "jpeg" ]];then
ArrayOfFiles[WhileArray]=${i/'|'*/}
ArrayOfsorted[WhileArray]=${i/[^*|]*|/}
WhileArray=$((WhileArray+1));
fi;
done <  info-mime-size-db.txt
echo done, the array is full

復元のためのループ

これは、ファイルの復元を管理するスクリプトの最後の部分です。宛先のサブディレクトリにファイルが一定数たまると、宛先フォルダに新しい番号付きサブディレクトリを作成し、そこにファイルをコピーし続けます。

SizeOfArray=${#ArrayOfFiles[@]}
while [  "${SizeOfArray}" != "${CountAll}" ]; do

IfExist="${Destination}${BaseSubDirName}${NewDirNumber}"
if [ ! -d "${IfExist}" ]; then echo mkdir -v "${IfExist}" -p;fi

CountToLimit=$((CountToLimit+1 ))
FileName=${ArrayOfsorted[CountAll]}
    if [ $CountToLimit -gt 25 ]; then
CountToLimit="0"
NewDirNumber=$((NewDirNumber+1))
fi;
NewDestination="$IfExist"

echo cp -fv "$PWD/${ArrayOfFiles[CountAll]}" "${IfExist}${FileName}"
CountAll=$((CountAll+1))
done
ノート: ファイル名や宛先ディレクトリ名にファイルに関するより具体的な詳細を追加するには、外部プログラムを使用して情報を収集する必要があります。例えば、画像の解像度については、feh feh -l "${ArrayOfFiles[$CountAll]}" | tail -1 | awk '{print $3"x"$4}'imagemagick identify ${ArrayOfFiles[$CountAll]} | awk '{print $3}' などがあります。

ファイルが十分に少ない場合

同じ拡張子を持つファイルがそれほど多くない場合、find -name *.xcf -exec copy "{}" $HOME/Desktop ; のようなものを使用するだけで十分です。宛先フォルダの「オーバーロード」を避けるために、見つかったファイルの数を計算できます find -type f -name *xcf | wc -l

ノート: photorec ユーティリティは、1つのフォルダに最大500個の回復ファイルを格納します。