• Uncategorized

About linux : How-to-write-a-bash-script-to-find-files-with-complex-conditions-duplicate

Question Detail

Expected Function: write a bash script showing all the regular files
with filename ended with “.xml” or “.yml” and with path not begined
with “./target/”, i.e., exclude the “target” subdirectory.

Example File List: ./a/a1.xml; ./a/a2.txt; ./b/b1.yml; ./target/t.xml;
Example Outout: ./a/a1.xml; ./b/b1.yml

I construct find options in a bash shell script like

find_opts=( -type f -a ( -not -path "./target/*" ) -a ( -false -o -name "*.xml" -o -name "*.yml" ) )
find . $find_opts

But it does not output the expected result. Howver, when I tpye the full command string in bash terminal as follows:

[[email protected]]#find . \( -type f -a \( -not -path "./target/*" \) -a \( -false -o -name "*.xml" -o -name "*.yml" \) \)

it works. What is the problem about the above bash script ?


Someone gives this reference link : Expanding a bash array only gives the first element

It is about “bash array”. But it seems that my problem is not about “bash array”. Would anyone give any reasons?

Please see How to exclude a directory in find . command to known why I use parentheses whiches look like an array. Anyway, I try two others attempts:

#the first one
find_opts=( -type f -a ( -not -path "./target/*" ) -a ( -false -o -name "*.xml" -o -name "*.yml" ) )
#the second one
find_opts=\\( -type f -a \\( -not -path "./target/*" \\) -a \\( -false -o -name "*.xml" -o -name "*.yml" \\) \\)
#the third one
find_opts=\( -type f -a \( -not -path "./target/*" \) -a \( -false -o -name "*.xml" -o -name "*.yml" \) \)

The first one and the third one give the same output which is unexpeced result. The second one occures an error.

syntax error near unexpected token `(‘

The problem is still here.


Someone give one more reference:Why does shell ignore quoting characters in arguments passed to it through variables?
It is about how to use bash array to pass arguments and the problem is solved by the following code:

find_opts=(\( -type f -a \( -not -path './target/*' \) -a \( -false -o -name '*.xml' -o -name '*.yml' \) \))
find . "${find_opts[@]}"

Question Answer

No answer for now.

You may also like...

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.