Skip to content
Advertisement

Find command in linux bash shell

the find command is:

find ./ ( -path dir_a -o -path dir_b ) -prune

I want to convert to:

./find.sh dir_a dir_b

so my code (is doesn’t work):

function myfind() {
   num=1
   tmp=""
   for i in $@
   do
       tmp="$tmp -path './$i' "
       if [ $((num++)) -ne $# ]
       then
           tmp="${tmp} -o"
       fi
   done
   echo $tmp # this is ok!!
   find ./ ( $tmp ) -prune # is doesn't work, why???
}

Advertisement

Answer

What you are attempting cannot be solved in the general case with “classic sh” because you need your script to work correctly with directories named * or '"[ ]"', and plain old flat strings simply don’t allow that to be properly quoted (easily, or even with a fair amount of complexity). Fortunately, as suggested in a comment, Bash arrays allow you to do this with all the necessary level of control. Just make sure to always use quotes around anything which could contain a file name.

#!/bin/bash
dir_args=()
oh=
for i; do
    dir_args+=($oh '-path' "$i")
    oh='-o'
done
find . ( "${dir_args[@]}" ) -prune
User contributions licensed under: CC BY-SA
2 People found this is helpful
Advertisement