Выбрать главу

;;

*) T2[${#T2[@]}]=${T2[1]}

T2[1]=" "

;;

esac

;;

3) : ;; # Assume it worked

*) return 1 ;;

esac

local -i len=${#T2[0]}

if [ $len -ne 32 ] ; then return 1 ; fi

eval $2=\( \"\$\{T2\[@\]\}\" \)

}

# # # # # Locate File # # # # #

#

# LocateFile [-l] FileName Location-Array-Name

# or

# LocateFile [-l] -of FileName Location-Array-FileName

# # # # #

# A file location is Filesystem-id and inode-number

# Here document used as a comment block.

: <<StatFieldsDoc

Based on stat, version 2.2

stat -t and stat -lt fields

[0] name

[1] Total size

File - number of bytes

Symbolic link - string length of pathname

[2] Number of (512 byte) blocks allocated

[3] File type and Access rights (hex)

[4] User ID of owner

[5] Group ID of owner

[6] Device number

[7] Inode number

[8] Number of hard links

[9] Device type (if inode device) Major

[10] Device type (if inode device) Minor

[11] Time of last access

May be disabled in 'mount' with noatime

atime of files changed by exec, read, pipe, utime, mknod (mmap?)

atime of directories changed by addition/deletion of files

[12] Time of last modification

mtime of files changed by write, truncate, utime, mknod

mtime of directories changed by addtition/deletion of files

[13] Time of last change

ctime reflects time of changed inode information (owner, group

permissions, link count

-*-*- Per:

Return code: 0

Size of array: 14

Contents of array

Element 0: /home/mszick

Element 1: 4096

Element 2: 8

Element 3: 41e8

Element 4: 500

Element 5: 500

Element 6: 303

Element 7: 32385

Element 8: 22

Element 9: 0

Element 10: 0

Element 11: 1051221030

Element 12: 1051214068

Element 13: 1051214068

For a link in the form of linkname -> realname

stat -t linkname returns the linkname (link) information

stat -lt linkname returns the realname information

stat -tf and stat -ltf fields

[0] name

[1] ID-0? # Maybe someday, but Linux stat structure

[2] ID-0? # does not have either LABEL nor UUID

# fields, currently information must come

# from file-system specific utilities

These will be munged into:

[1] UUID if possible

[2] Volume Label if possible

Note: 'mount -l' does return the label and could return the UUID

[3] Maximum length of filenames

[4] Filesystem type

[5] Total blocks in the filesystem

[6] Free blocks

[7] Free blocks for non-root user(s)

[8] Block size of the filesystem

[9] Total inodes

[10] Free inodes

-*-*- Per:

Return code: 0

Size of array: 11

Contents of array

Element 0: /home/mszick

Element 1: 0

Element 2: 0

Element 3: 255

Element 4: ef53

Element 5: 2581445

Element 6: 2277180

Element 7: 2146050

Element 8: 4096

Element 9: 1311552

Element 10: 1276425

StatFieldsDoc

# LocateFile [-l] FileName Location-Array-Name

# LocateFile [-l] -of FileName Location-Array-FileName

LocateFile()

{

local -a LOC LOC1 LOC2

local lk="" of=0

case "$#" in

0) return 1 ;;

1) return 1 ;;

2) : ;;

*) while (( "$#" > 2 ))

do

case "$1" in

-l) lk=-1 ;;

-of) of=1 ;;

*) return 1 ;;

esac

shift

done ;;

esac

# More Sanscrit-2.0.5

# LOC1=( $(stat -t $lk $1) )

# LOC2=( $(stat -tf $lk $1) )

# Uncomment above two lines if system has "stat" command installed.

LOC=( ${LOC1[@]:0:1} ${LOC1[@]:3:11}

${LOC2[@]:1:2} ${LOC2[@]:4:1} )

case "$of" in

0) eval $2=\( \"\$\{LOC\[@\]\}\" \) ;;

1) echo "${LOC[@]}" > "$2" ;;

esac

return 0

# Which yields (if you are lucky, and have "stat" installed)

# -*-*- Location Discriptor -*-*-

# Return code: 0

# Size of array: 15

# Contents of array

# Element 0: /home/mszick 20th Century name

# Element 1: 41e8 Type and Permissions

# Element 2: 500 User

# Element 3: 500 Group

# Element 4: 303 Device

# Element 5: 32385 inode

# Element 6: 22 Link count

# Element 7: 0 Device Major

# Element 8: 0 Device Minor

# Element 9: 1051224608 Last Access

# Element 10: 1051214068 Last Modify

# Element 11: 1051214068 Last Status

# Element 12: 0 UUID (to be)

# Element 13: 0 Volume Label (to be)

# Element 14: ef53 Filesystem type

}

# And then there was some test code

ListArray() # ListArray Name

{

local -a Ta

eval Ta=\( \"\$\{$1\[@\]\}\" \)

echo

echo "-*-*- List of Array -*-*-"

echo "Size of array $1: ${#Ta[*]}"

echo "Contents of array $1:"

for (( i=0 ; i<${#Ta[*]} ; i++ ))

do

echo -e "\tElement $i: ${Ta[$i]}"

done

return 0

}

declare -a CUR_DIR

# For small arrays

ListDirectory "${PWD}" CUR_DIR

ListArray CUR_DIR

declare -a DIR_DIG

DigestFile CUR_DIR DIR_DIG

echo "The new \"name\" (checksum) for ${CUR_DIR[9]} is ${DIR_DIG[0]}"

declare -a DIR_ENT

# BIG_DIR # For really big arrays - use a temporary file in ramdisk

# BIG-DIR # ListDirectory -of "${CUR_DIR[11]}/*" "/tmpfs/junk2"

ListDirectory "${CUR_DIR[11]}/*" DIR_ENT

declare -a DIR_IDX

# BIG-DIR # IndexList -if "/tmpfs/junk2" DIR_IDX

IndexList DIR_ENT DIR_IDX

declare -a IDX_DIG

# BIG-DIR # DIR_ENT=( $(cat /tmpfs/junk2) )

# BIG-DIR # DigestFile -if /tmpfs/junk2 IDX_DIG

DigestFile DIR_ENT IDX_DIG

# Small (should) be able to parallize IndexList & DigestFile

# Large (should) be able to parallize IndexList & DigestFile & the assignment

echo "The \"name\" (checksum) for the contents of ${PWD} is ${IDX_DIG[0]}"