2013-11-24 3 views
1

I found a bash script online для массового восстановления файлов с использованием Sleuthkit, но у меня возникли проблемы с его использованием из-за того, что я считаю ошибкой самого скрипта. Вот сценарий:Bash Script: Mass Restore Files with 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 

Очевидно, что скрипт пытается использовать строку как разделитель, который команда вырезать не делает позволять. Однако это необязательно, так как вывод фактически разделен на вкладку. Однако удаление разделителя вызывает это сообщение об ошибке:

[: 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'} является файл дескрипторы, как это :

134164-128-1: 
233761-128-1: 
129177-128-1: 
23963-128-1: 

Мои подозрения в том, что двоеточие (:) была проблема, так что я удалил его по конвейеру filenode к sed утверждение, что избавилась от сотрудничества lon, но это также не устранило проблему. Таким образом, после изменения этой линии, чтобы восстановить первый вопрос:

filename=`echo "$line" | cut -f 2 -d ' '` 

To:

filename=`echo "$line" | cut -f 2` 

И даже после удаления толстой кишки из числа файлов индексных дескрипторов, я до сих пор застрял с этой ошибкой:

[: 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 

Так что это все об устранении неполадок и мышления, я сделал до сих пор. Есть идеи?

UPDATE

меня попросили показать выход 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$ 

ответ

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 
+0

Кстати, ваш вопрос уже хорошо документирован, и я тоже его поддержал – anubhava

+0

Могут ли двоеточия быть проблемой? – Dan

+0

Давайте продолжим обсуждение в чате (http: //chat.stackoverflow.com/rooms/41989/discussion-between-dan-and-anubhava) – Dan