I am searching for files which name which contain AAA within their path using following command:

find path_A -name "*AAA*"

Given the output showed by the above command, I want to move those files into another path, say path_B. Instead of moving those file one by one, can I optimize the command by moving those files right after the find command?

6 Answers
6

That will use find's -exec option which replaces the {} with each find result in turn and runs the command you give it. As explained in man find:

-exec command ;
Execute command; true if 0 status is returned. All following
arguments to find are taken to be arguments to the command until
an argument consisting of `;' is encountered.

In this case, we are using the + version of -exec so that we run as few mv operations as possible:

-exec command {} +
This variant of the -exec action runs the specified command on
the selected files, but the command line is built by appending
each selected file name at the end; the total number of invoca‐
tions of the command will be much less than the number of
matched files. The command line is built in much the same way
that xargs builds its command lines. Only one instance of `{}'
is allowed within the command. The command is executed in the
starting directory.

Thanks for this! I was trying to use -exec mv {} path_b + and it was failing with permissions errors. TBH, I still don't understand why, but -exec mv -t path_b {} + works a treat!
– Jeremy DavisApr 10 '18 at 0:55

2

@JeremyDavis When using -exec ... {} +, the {} has to be the last thing before the +. This is why he uses mv -t destdir {} + and not mv {} destdir +. One cold have used -exec mv {} destdir ';' instead, but that would have executed mv once for each file.
– KusalanandaMay 6 '18 at 12:40

That's the safe way, it can deal with file names that contain spaces, newlines or other strange characters. A simpler way, but one that fails unless your file names consist only of simple alphanumeric characters, is

Thank you for your interest in this question.
Because it has attracted low-quality or spam answers that had to be removed, posting an answer now requires 10 reputation on this site (the association bonus does not count).