跳转至内容

File recovery/Post recovery tasks

来自 ArchWiki
注意 要加快对恢复或还原文件的访问速度,您可以使用 shake 工具对其进行碎片整理。

按校验和仅列出唯一文件

  • 要仅列出 photorec 可以恢复原始名称的文件,您可以在 awkprint 前面添加 if(index(A,"_") != 0)。您也可以将 awk 用作独立命令,对已创建的文件仅列出您需要的文件名或扩展名。
  • 要仅列出扩展名,您可以在 awk 中使用 D=B;gsub(/[^*\.]*\./,"",D),这将删除最后一个 . 点之前的所有内容,即使是 tar.gz 扩展名也只显示 gz,或者您可以使用 sub 代替 gsub,它只会删除文件名中第一个点之前的内容。

当文件被恢复时,可能会有很多文件具有相同的 校验和,通过创建一个仅包含一个找到的重复文件的唯一文件列表,您将能够通过使用其中存储的文件名和路径,使用其他实用程序加快收集有关文件的额外信息的速度。

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}}' 

这将在屏幕上显示结果,格式为:文件名|已恢复文件名|文件完整路径|校验和

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

清理和排序文件名

为了使目标文件名更易于 bash 使用,您可以删除特殊符号、空格,并按第二列排序,以便更好地查看具有不同校验和的重复名称。在重复文件名之前会添加一个数字,以 ¤ 作为分隔符,放在 已恢复文件名 的前面。脚本将使用上面脚本创建的文件,并将结果输出到 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 十六进制代码,而不是删除所有这些符号。

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

脚本将创建一个文件,其格式为:文件路径/文件名 | 关于文件的信息 | MIME 类型 | 大小 | 文件名 | 已恢复文件名,例如:./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 的数据库文件,其中包含文件的信息。

警告
  • 删除 cpmkdir 前面的 echo 命令,否则脚本将只显示将要执行的操作而不会将任何内容恢复到目标位置,进行一次试运行。使用 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 循环

这里将提供简短的示例,说明如何通过使用 bash 标准表达式而不是 awkgrepsed 来加速从模式文件中填充数组。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 工具在一个文件夹中最多存储 500 个恢复的文件。