find -name “*.xyz” -o -name “*.abc” -exec to Execute on all found files, not just the last suffix specified

心已入冬 提交于 2019-12-20 09:15:06

问题


I'm trying to run

find ./ -name "*.xyz" -o -name "*.abc" -exec cp {} /path/i/want/to/copy/to

In reality it's a larger list of name extensions but I don't know that matters for this example. Basically I'd like to copy all those found to another /path/i/want/to/copy/to. However it seems to only be executing the last -name test in the list.

If I remove the -exec portion all the variations of files I expect to be found are printed out.

How do I get it to pass the full complement of files found to -exec?


回答1:


find works by evaluating the expressions you give it until it can determine the truth value (true or false) of the entire expression. In your case, you're essentially doing the following, since by default it ANDs the expressions together.

-name "*.xyz" OR ( -name "*.abc" AND -exec ... )

Quoth the man page:

GNU find searches the directory tree rooted at each given file name by evaluating the given expression from left to right, according to the rules of precedence (see section OPERATORS), until the outcome is known (the left hand side is false for and operations, true for or), at which point find moves on to the next file name.

That means that if the name matches *.xyz, it won't even try to check the latter -name test or -exec, since it's already true.

What you want to do is enforce precedence, which you can do with parentheses. Annoyingly, you also need to use backslashes to escape them on the shell:

find ./ \( -name "*.xyz" -o -name "*.abc" \) -exec cp {} /path/i/want/to/copy/to \;



回答2:


More usable than Jaypal's solution would maybe be:

   find ./ -regex ".*\.\(jpg\|png\)" -exec cp {} /path/to



回答3:


find . \( -name "*.xyz" -o -name "*.abc" \) -exec cp {} /path/i/want/to/copy/to \;



回答4:


It may work:

find ./ -name "*.{xyz,abc}" -exec cp {} /path/i/want/to/copy/to


来源:https://stackoverflow.com/questions/8887972/find-name-xyz-o-name-abc-exec-to-execute-on-all-found-files-not-jus

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!