Home > Software design >  Loop over find result in bash
Loop over find result in bash

Time:10-04

I have a bash script written by some previous colleague in my company. It's shellcheck result is horrible and me, who is using zsh can't run the script. He seems to use the notorious find with for loop thingy in bash. But I can't figure out how to get it better.

At the moment i got a temporary fix.

this is his code

#!/bin/bash

  releases=$(for d in $(find ${DELIVERIES} -maxdepth 1 -type d -name "*_delivery_33_SR*" | sort) ; do echo ${d##*_} ; done)
  
  
  for sr in ${releases[@]}
  do
         echo "Release $sr"
         deliveries=$(find ${deliveries_path}/*${sr}/ -type f -name "*.ear" -o -name "*.war" | sort)
         if [ ! -e ${sr}.txt ]
         then
                 for d in ${deliveries[@]}
                 do
                         echo "$(basename $d)" | tee -a ${sr}.txt
                 done
         fi
         echo
  done

And this is my code that get to even loop the first part.

#!/bin/bash
                                                                                                                                                             
  for release in $(for d in $(find "${DELIVERIES}" -maxdepth 1 -type d -name "*_delivery_33_SR*" | sort) ; do echo "${d##*_}" ; done)
  do                                                                                                                                 
    echo "Release $release"                                   
  done

As you can see I needed to put the find inside the loop and I cant save it in an variable, because when i try to loop over it will try to put \n everywhere and it is like a single element? Could any1 suggest How should I solve this problem, because this previous colleague uses this kind of find search a lot.

EDIT:

The script went to each folder with a specific name and then created a file X.X.X.txt with the version number in the X part. And appended the filenames inside the subfolder to the X.X.X.txt

CodePudding user response:

Blindly refactoring gets me something like

#!/bin/bash

for d in "$DELIVERIES"/*_delivery_33_SR*/; do
    sr=${d##*_}
    echo "Release $sr"
    if [ ! -e "${sr}.txt" ]
    then
        find "${deliveries_path}"/*"${sr}"/ -type f -name "*.ear" -o -name "*.war" |
        sort |
        xargs -n 1 basename |
        tee -a "$sr.txt"
    fi
    echo
done
  • Related