How to integrate mv command after find command?

  • 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?

  • cuonglm

    cuonglm Correct answer

    6 years ago

    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.

    Don't forget the "\;" at the end of the exec!

    @Charles Roth: it's `+` which dows the job, you can read my quote above or `man find` instead

    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!

    @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.

License under CC-BY-SA with attribution

Content dated before 6/26/2020 9:53 AM