我found a bash script online使用Sleuthkit进行大量恢复文件,但由于我认为脚本本身存在错误,因此无法使用它。这是脚本:
IMAGE=$1
LIST=$2
DEST=$3
cat $LIST | while read line; do
filetype=`echo "$line" | awk {'print $1'}`
filenode=`echo "$line" | awk {'print $2'}`
filenode=${filenode%:}
filename=`echo "$line" | cut -f 2 -d ' '`
if [ $filetype == "r/r" ]; then
echo "$filename"
mkdir -p "`dirname "$DEST/$filename"`"
icat -f ext2 -r -s $IMAGE "$filenode" > "$DEST/$filename"
fi
done
一切正常,直到引发此错误的cut
语句:
cut: the delimiter must be a single character
显然,脚本试图使用字符串作为cut命令不允许的分隔符。但是,这不是必需的,因为输出实际上是制表符分隔的。但是,删除分隔符会产生以下错误消息:
[: 16: r/r: unexpected operator
对于每一行。输入(LIST文件)如下所示:
r/r 8457-128-3: Architects list.docx
r/r 90219-128-4: ACID Pro 7.0 Projects/Track 2 - 3.sfk
r/r 90208-128-4: ACID Pro 7.0 Projects/Track 2 - 3.wav
r/r 192969-128-3: OLD SCHOOL PAPERS/Doc Comp.docx
awk {'print $1'}
的输出是这两行中的一行:
r/r
d/d
awk {'print $2'}
的输出是文件inode,如下所示:
134164-128-1:
233761-128-1:
129177-128-1:
23963-128-1:
我怀疑是冒号(:)是问题,所以我通过将filenode传递给摆脱冒号的sed
语句来删除它,但这也没有解决问题。因此,在修改此行以修复第一个问题后:
filename=`echo "$line" | cut -f 2 -d ' '`
要:
filename=`echo "$line" | cut -f 2`
即使从文件inode号中删除了冒号,我仍然遇到这个错误:
[: 16: r/r: unexpected operator
该脚本是为ext2文件系统编写的,但我在NTFS文件系统上使用它。我已经修改了必要的行,并且可以使icat
命令按照写入的方式工作,所以这不是不改变相关部分的问题(单个行工作正常,我调试了这个以及我知道的如何)。
这是我目前的剧本:
IMAGE=/dev/sdb
LIST=files.lst
DEST=~/Desktop/sol/backup
cat $LIST | while read line; do
filetype=`echo "$line" | awk {'print $1'}`
filenode=`echo "$line" | awk {'print $2'}`
filenode=${filenode%:}
filename=`echo "$line" | cut -f 2`
if [ $filetype == "r/r" ]; then
echo "$filename"
mkdir -p "`dirname "$DEST/$filename"`"
icat -f ntfs -o 409600 -r -s $IMAGE "$filenode" > "$DEST/$filename"
fi
done
这就是我到目前为止所做的所有故障排除和思考。有什么想法吗?
更新
我被要求显示cat -vte $LIST
的输出,如下(样本):
r/r 284268-128-4:^IVirtualDJ/Skins/VirtualDJ 7 (6 Decks).zip$
r/r 284265-128-4:^IVirtualDJ/Skins/VirtualDJ5.zip$
d/d 284231-144-6:^IVirtualDJ/Tracklisting$
r/r 284345-128-4:^IVirtualDJ/Tracklisting/2013-06-21.m3u$
d/d 15695-144-1:^IMy Music$
r/r 14970-128-3:^IDemotivational pics.docx$
r/r 1677-128-1:^Idesktop.ini$
r/r 881-128-4:^IDocument 1.doc$
答案 0 :(得分:1)
阅读您的制表符分隔文件,如下所示:
while IFS=$' \t:' read filetype filenode filename; do
if [ "$filetype" = "r/r" ]; then
echo "$filename"
mkdir -p "`dirname "$DEST/$filename"`"
icat -f ntfs -o 409600 -r -s $IMAGE "$filenode" > "$DEST/$filename"
fi
done < $LIST