Vasyl Stepulo
Vasyl Stepulo

Reputation: 1603

Bash get list of zip files in dir and perform some operations on each of them

I have a bash script, which goes through list of directories and if some directory contains zip files it bind zip file name into variable and perform some actions over it and then goes to another in this dir. Unfortunately, it works when there is one zip file per directory. If more - it gives error "Binary operator expected"

Script:

    if [ -e $currdir/*.zip ]; then 
        for file in $currdir/*.zip; do
            echo the zip is "${file##*/}"
        done

Please help me to rework script accordingly.

Upvotes: 0

Views: 1456

Answers (3)

shellter
shellter

Reputation: 37268

I think the case construct is too often overlooked.

  case *.jpg in *.jpg ) echo found files ;; * ) echo no files found  ;; esac

produces the correct message in my dir with 1000s+ jpgs ;-)

Change both references from jpg to zip and see if it works for you.

IHTH

Upvotes: 0

Bohdan Blyzniuk
Bohdan Blyzniuk

Reputation: 634

If you need exactly check then you can use:

if [[ -n $(echo "$currdir"/*.zip) ]]; then
  for f in "$currdir"/*.zip; do
   echo "Processing $f file..";
  done
fi

But I'd prefer just looping over files that contain *.zip extension:

for f in "$currdir"/*.zip; do
   echo "Processing $f file..";
done

Upvotes: 1

Andreas Louv
Andreas Louv

Reputation: 47099

Use

for file in "$currdir"/*.zip; do
  [ -e "$file" ] || continue
  echo the zip is "${file##*/}"
done

As pointed out in the comments the glob will happen in the shell, then [ is called with the output, i.e:

[ -e * ]

will become:

[ -e Desktop Documents Downloads ... ]

Therefore trying to expand and checking in the for iteration will work.

Please see: http://mywiki.wooledge.org/WordSplitting and http://wiki.bash-hackers.org/syntax/expansion/globs

Upvotes: 0

Related Questions