-
December 6th, 2004, 05:24 AM
#1
Need recursive bash script tested...
I have written a small script to calculate sha1 sums recursively through a directory tree, whoch works here on my system. However, my knowldege of awk scripting is extremely limited, so I'm not sure if it will work anywhere else. I would appreciate anyone testing it who has the ability and the inclination to do so.
#!/bin/bash
do_directory () {
curdir=$1
startdir=$2
for file in *; do
if [[ -f "$file" ]]; then
if [[ -n $curdir ]]; then
sha1sum "$file" | awk -F " " -v directory="$curdir" '{
print $1 " " directory "/" $2
}' >> "$startdir"/sha1sums.txt
else
sha1sum "$file" | awk -F " " -v directory="$curdir" '{
print $1 " " directory $2
}' >> "$startdir"/sha1sums.txt
fi
elif [[ -d "$file" ]]; then
local previousdirectory="$curdir"
if [[ -n $curdir ]]; then
curdir="$curdir/$file"
else
curdir="$file"
fi
cd "$file"
do_directory "$curdir" "$startdir"
curdir="$previousdirectory"
cd ..
fi
done
}
startdir=`pwd`
do_directory "" "$startdir"
The generated hash file should be compatible with the "sha1sum -c" command (at least that's the point). It cannot at this point handle filenames with double spaces in them. This script should be useful for quickly calculating these hashes on files found during forensic investigations, and the results can be piped through netcat.
Any help in testing this would be appreciated.
<edit>
In the two awk statements, the field delimiter specified by -F " " should contain TWO spaces between the quotes, but the PHP engine on this site only displays one. This is necessary to prcess filenames with spaces.
</edit>
Government is like fire - a handy servant, but a dangerous master - George Washington
Government is not reason, it is not eloquence - it is force. - George Washington.
Join the UnError community!
-
December 6th, 2004, 08:23 AM
#2
Your script works here on cygwin.
But I prefer letting find do the directory browsing though...
Code:
find . -type f -exec sha1sum {} \;
or
Code:
find . -type f | while read file ; do
# do whatever what you wanna do here
sha1sum $file
done
Peace always,
<jdenny>
Always listen to experts. They\'ll tell you what can\'t be done and why. Then go and do it. -- Robert Heinlein
I\'m basically a very lazy person who likes to get credit for things other people actually do. -- Linus Torvalds
-
December 6th, 2004, 08:59 AM
#3
Hi
Good idea, good job!
Your script also runs like charm on debian sarge 2.4.26.
To solve your space-problem, try the following approach.
However, the compatibility to other systems should be tested
(it should be POSIX compatible).
Code:
#!/bin/bash
OLDIFS="$IFS"
IFS='
'
do_directory () {
curdir=$1
startdir=$2
for file in *; do
if [[ -f "$file" ]]; then
if [[ -n "$curdir" ]]; then
echo "$startdir/$curdir/$file"
sha1sum "$startdir/$curdir/$file" >> "$startdir"/sha1sums.txt
else
echo "$startdir/$file"
sha1sum "$startdir/$file" >> "$startdir"/sha1sums.txt
fi
elif [[ -d "$file" ]]; then
local previousdirectory="$curdir"
if [[ -n "$curdir" ]]; then
curdir="$curdir/$file"
else
curdir="$file"
fi
cd "$file"
do_directory "$curdir" "$startdir"
curdir="$previousdirectory"
cd ..
fi
done
}
startdir=`pwd`
do_directory "" "$startdir"
IFS="$OLDIFS"
Cheers
If the only tool you have is a hammer, you tend to see every problem as a nail.
(Abraham Maslow, Psychologist, 1908-70)
-
December 6th, 2004, 01:45 PM
#4
Good morning (here anyway - 7:30)
Thanks for your help guys, will try these later today while I wai for a configure/compile process to run.
Also, if anyone known another way it could be useful, let me know.
Government is like fire - a handy servant, but a dangerous master - George Washington
Government is not reason, it is not eloquence - it is force. - George Washington.
Join the UnError community!
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
|