How to integrate mv command after find command?
With GNU mv:
find path_A -name '*AAA*' -exec mv -t path_B {} +
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.
You could do something like below as well.
find path_A -name "*AAA*" -print0 | xargs -0 -I {} mv {} path_B
Where,
-0
If there are blank spaces or characters (including newlines) many commands will not work. This option take cares of file names with blank space.-I
Replace occurrences of replace-str in the initial-arguments with names read from standard input. Also, unquoted blanks do not terminate input items; instead the separator is the newline character.
Testing
I created two directories as sourcedir
and destdir
. Now, I created bunch of files inside sourcedir
as file1.bak
, file2.bak
and file3 with spaces.bak
Now, I executed the command as,
find . -name "*.bak" -print0 | xargs -0 -I {} mv {} /destdir/
Now, inside the destdir
, when I do ls
, I could see that the files have moved from sourcedir
to destdir
.
References
http://www.cyberciti.biz/faq/linux-unix-bsd-xargs-construct-argument-lists-utility/
For the benefit of OS X users coming across this question, the syntax in OS X is slightly different. Assuming you do not want to search recursively in subdirectories of path_A
:
find path_A -maxdepth 1 -name "*AAA*" -exec mv {} path_B \;
If you want to search all files recursively in path_A
:
find path_A -name "*AAA*" -exec mv {} path_B \;