1) On the localhost Im doing `ls -l` on the /path/to/files and cutting the file size.
Using "cut" assumes you'll have single space separation. If you insist on using "ls" then use something like awk. Using "stat -c %s" gives you exactly what you require (filesize only) so no overhead. Next to that having names and sizes mixed in an array like this won't work unless you have a way to select name then select size to compare. It's not hard but it looks kind of inefficient to me. Of course you can have an array consisting of a single filename and size but the you'd have to ssh a gazillion times.
2) Feeding the output of `ls -l` into an array
... without checking what's in the array. Anyway. If you work with a single value you don't need the array and you can get the length of the string as well: size=$(stat -c %s /some/file); len=${#size}.
3) Doing ssh remote_host "ls -l /path/to/files" and then feeding it into an array
...which should run ssh on each file? Bit much.
Ive been able to feed the output into the array, but am not able to figure out how to compare the value of the arrays....
Code:
# check numerical
echo "${array0[1]}"|grep -qv [a-z]; case "$?" in
0) if [ "${array0[1]}" -eq "${array1[1]}" ]; then doSomething; fi;;
*) if [ "${array0[1]}" = "${array1[1]}" ]; then doSomething; fi;;
esac
else
check the example in your previous thread about the same subject?
Maybe I don't get what you're trying to do, but this looks like it.
Code:
#!/bin/sh
# first size is array0[0]; first filename is array0[1]
array0=($(find /home/danish/scp -type f -maxdepth 1 2>/dev/null | while read f; do stat -c "%s %n" "${f}"; done))
array1=($(ssh 192.168.10.98 'find /home/danish/scp -type f -maxdepth 1 2>/dev/null | xargs -iF stat -c "%s %n" "F"'))
if [ "${#array0[@]}" = "${#array1[@]}" ]; then
n=0; until [ "$n" -eq "$[${#array0[@]}+1]" ]; do fn=$[${n}+1]
# compare name
if [ "${array0[$fn]}" = "${array1[$fn]}" ]; then
# compare size and if match echo rm
if [ "${array0[$n]}" = "${array1[$n]}" ]; then
# somehow size turns up in the rm list;
# too lazy to figure out why: wedge in file check instead
[ -f "${array0[$fn]}" ] && echo "rm ${array0[$fn]}"
fi
else
echo "filenames don't match"
fi
((n++))
done
else
echo "Dissimilar amount of elements in arrays"
fi
# always return zero on script exit
exit 0
This is horrid and should *never* be used.