「リカバリ後のタスク」の版間の差分
Kusanaginoturugi (トーク | 投稿記録) (→配列のデータを含むファイルの作成: 校正) |
Kusanaginoturugi (トーク | 投稿記録) (add en page link.) |
||
(同じ利用者による、間の6版が非表示) | |||
1行目: | 1行目: | ||
+ | [[en:Post recovery tasks]] |
||
[[Category:システムリカバリ]] |
[[Category:システムリカバリ]] |
||
{{Related articles start}} |
{{Related articles start}} |
||
71行目: | 72行目: | ||
=== リカバリ後のタスク === |
=== リカバリ後のタスク === |
||
− | このスクリプトは、'''path to file/file name | info about the file | mime type | size | filename | restored_filename''' のパターンでファイルを作成します。以下に例を示します |
+ | このスクリプトは、'''path to file/file name | info about the file | mime type | size | filename | restored_filename''' のパターンでファイルを作成します。以下に例を示します: |
+ | {{ic|<nowiki>./recup_dir.1/f872690288_image.jpg|JPEG image data, JFIF standard 1.01|image/jpeg|24K|f872690288_image.jpg|image.jpg</nowiki>}} |
||
{{Warning| |
{{Warning| |
||
+ | {{ic|echo}} コマンドを {{ic|cp}} と {{ic|mkdir}} の前から削除してください。そうしないと、スクリプトは実際に何も復元せず、宛先に何が行われるかを示すだけになります。 {{ic|echo}} コマンドを使って、ファイル名や宛先の設定が正しく表示されていることを確認するのは良い方法です。 |
||
− | * Remove the {{ic|echo}} command in front of the {{ic|cp}} and {{ic|mkdir}} otherwise the script will only show what is going to to be done without restoring anything to a destination, do a dry run. To use {{ic|echo}} command is good for verify that settings for filenames and destinations looks correctly. |
||
+ | これらのスクリプトは、 ''photorec'' で作成されたフォルダからファイルを復元するための例です。注意してください!}} |
||
− | * Those scripts are only examples for restoration of files from folders created by ''photorec'', be careful!}} |
||
− | ==== |
+ | ==== スクリプトの先頭 ==== |
+ | 現在のディレクトリに {{ic|info-mime-size-db.txt}} が存在するかどうかを簡単に確認する方法は以下の通りです。スクリプトの残りの部分で可能なエラーを防ぐためです。 |
||
− | Here is a simple check if the {{ic|info-mime-size-db.txt}} exists in the current directory to prevent possible errors with rest of the script. |
||
{{bc|#!/bin/bash |
{{bc|#!/bin/bash |
||
if [ -f info-mime-size-db.txt ]; then echo The file info-mime-size-db.txt exists continuing... ; |
if [ -f info-mime-size-db.txt ]; then echo The file info-mime-size-db.txt exists continuing... ; |
||
87行目: | 89行目: | ||
}} |
}} |
||
− | ==== |
+ | ==== 変数の開始 ==== |
{{bc|1=CountAll="0" |
{{bc|1=CountAll="0" |
||
96行目: | 98行目: | ||
CountToLimit="0"}} |
CountToLimit="0"}} |
||
− | ==== |
+ | ==== 配列にデータを追加 ==== |
+ | {{Warning|配列は {{ic|info-mime-size-db.txt}} ファイルからデータを読み込むことで追加されます。そうでない場合、スクリプトは正しく動作しません!}} |
||
− | {{Warning|Arrays become populated by reading data from a {{ic|info-mime-size-db.txt}} file. Otherwise the script will not work correctly!}} |
||
− | ===== |
+ | ===== while ループを使った方法 ===== |
− | + | ここでは、''awk''、''grep''、および ''sed'' の代わりに [https://tldp.org/LDP/abs/html/string-manipulation.html bash standard expressions] を使用して、ファイルからパターンを持つ配列を高速化する方法について簡単な例を示します。{{ic|ArrayOfFiles}} 配列にはファイルへの完全なパスが含まれ、{{ic|ArrayOfsorted}} には ''photorec'' によって復元された元の名前が含まれますが、ランダムに生成された部分は含まれません。 |
|
{{bc|<nowiki> |
{{bc|<nowiki> |
||
116行目: | 118行目: | ||
</nowiki>}} |
</nowiki>}} |
||
− | ==== |
+ | ==== 復元のためのループ ==== |
+ | これは、ファイルの復元を管理するスクリプトの最後の部分です。宛先のサブディレクトリにファイルが一定数たまると、宛先フォルダに新しい番号付きサブディレクトリを作成し、そこにファイルをコピーし続けます。 |
||
− | This is a finale part of a script that manages restoration of files. When limit of files in a destination sub-directory reached then it creates and new one numbered sub-directory in the destination folder and continuing to copy files there. |
||
{{bc|<nowiki>SizeOfArray=${#ArrayOfFiles[@]} |
{{bc|<nowiki>SizeOfArray=${#ArrayOfFiles[@]} |
||
137行目: | 139行目: | ||
CountAll=$((CountAll+1)) |
CountAll=$((CountAll+1)) |
||
done</nowiki>}} |
done</nowiki>}} |
||
− | {{Note| |
+ | {{Note|ファイル名や宛先ディレクトリ名にファイルに関するより具体的な詳細を追加するには、外部プログラムを使用して情報を収集する必要があります。例えば、画像の解像度については、{{Pkg|feh}} {{ic|<nowiki>feh -l "${ArrayOfFiles[$CountAll]}" | tail -1 | awk '{print $3"x"$4}'</nowiki>}}、{{Pkg|imagemagick}} {{ic|<nowiki>identify ${ArrayOfFiles[$CountAll]} | awk '{print $3}'</nowiki>}} などがあります。 }} |
+ | == ファイルが十分に少ない場合 == |
||
− | == Enough if files are few == |
||
− | + | 同じ拡張子を持つファイルがそれほど多くない場合、{{ic|find -name *.xcf -exec copy "{}" $HOME/Desktop ;}} のようなものを使用するだけで十分です。宛先フォルダの「オーバーロード」を避けるために、見つかったファイルの数を計算できます {{ic|<nowiki>find -type f -name *xcf | wc -l</nowiki>}}。{{Note|photorec ユーティリティは、1つのフォルダに最大500個の回復ファイルを格納します。}} |
2023年4月6日 (木) 16:43時点における最新版
関連記事
目次
チェックサムで一意なファイルのみをリストする
ファイルが復元されると、多くのファイルが同じ ハッシュ値 を持つ場合があります。重複するファイルの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
ファイル名に特殊記号が含まれている場合、特にそれらがファイル名の先頭にある場合は、クォートやバックスラッシュ を使用しないと、
mv
や cp
のようなコマンドで管理するのが難しくなりますが、それらをすべて削除する代わりに、HTML hex codes で置き換えることができます。
Photorec
配列のデータを含むファイルの作成
この例では、xdg-mime を使用して mime タイプに関する情報を収集していますが、file --mime-type -b
と file -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
スクリプトの先頭
現在のディレクトリに 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"
配列にデータを追加
while ループを使った方法
ここでは、awk、grep、および 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
ファイルが十分に少ない場合
同じ拡張子を持つファイルがそれほど多くない場合、find -name *.xcf -exec copy "{}" $HOME/Desktop ;
のようなものを使用するだけで十分です。宛先フォルダの「オーバーロード」を避けるために、見つかったファイルの数を計算できます find -type f -name *xcf | wc -l
。