'Binary operator expected in my bash script

With this bash script, I check the directory for *xls files, and if they are, I send them for conversion using ssconvert to *xlsx. All this works if there is only one file in the directory. If there are several or more in the directory, a "binary operator expected" error appears. Please help me fix my script.

#!/bin/bash
while true
do
test -f /home/doc/testy/*.xls && for f in /home/doc/testy/*.xls; do ssconvert "$f" "${f%.xls}.xlsx";
chown www-data:www-data "${f%.xls}.xlsx";
rm -f -- "$f"; done
sleep 10
done


Solution 1:[1]

test -f can only handle 1 file at a time, but you can use find instead. I don't know how to combine find's -exec with your ${f%.xls}.xlsx, so i made this look a little bit different.

#!/bin/bash -u                                                                                                                                                                                

DIRECTORY=/home/doc/testy/
export EXTENSION_OLD=xls
export EXTENSION_NEW=xlsx

function doConvert {
    fOld="$1"
    fNew="${fOld%.$EXTENSION_OLD}.$EXTENSION_NEW"
    ssconvert "$fOld" "$fNew";
    chown www-data:www-data "$fNew";
    rm -f -- "$fOld";
}
export -f doConvert

cd $DIRECTORY
while true; do
    find -type f -name "*.$EXTENSION_OLD" -exec bash -c "doConvert {}" \;
    sleep 10
done

Solution 2:[2]

Let me assume you are intentionally creating an infinite loop to watch the specified directory for newly generated files.
You need to check the existence of the file within the for f in .. loop. Then would you please try:

while true; do
    for f in /home/doc/testy/*.xls; do
        if [[ -f $f ]]; then
            newfile=${f}x
            ssconvert "$f" "$newfile"
            chown www-data:www-data "$newfile"
            rm -f -- "$f"
        fi
    done
    sleep 10
done

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Sheldon
Solution 2