find命令后如何集成mv命令?

find命令后如何集成mv命令?

AAA我正在使用以下命令搜索名称包含在其路径中的文件:

find path_A -name "*AAA*"

鉴于上述命令显示的输出,我想将这些文件移动到另一个路径,例如path_B.我可以通过在 find 命令之后立即移动这些文件来优化命令,而不是逐一移动这些文件吗?

答案1

与GNUMV:

find path_A -name '*AAA*' -exec mv -t path_B {} +

这将使用 find 的-exec选项,该选项{}依次替换每个查找结果并运行您给出的命令。正如中所解释的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.  

在本例中,我们使用+的版本-exec,以便运行mv尽可能少的操作:

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

答案2

你也可以做如下的事情。

find path_A -name "*AAA*" -print0 | xargs -0 -I {} mv {} path_B

在哪里,

  1. -0如果有空格或字符(包括换行符),许多命令将不起作用。此选项负责处理带有空格的文件名。
  2. -I将初始参数中出现的replace-str 替换为从标准输入读取的名称。此外,不带引号的空格不会终止输入项;相反,分隔符是换行符。

测试

我创建了两个目录作为sourcedirdestdir。现在,我在sourcediras中创建了一堆文件file1.bakfile2.bak并且file3 with spaces.bak

现在,我执行命令为,

find . -name "*.bak" -print0 | xargs -0 -I {} mv {} /destdir/

现在,destdir当我这样做时ls,我可以看到文件已从 移动sourcedirdestdir

参考

http://www.cyberciti.biz/faq/linux-unix-bsd-xargs-construct-argument-lists-utility/

答案3

为了方便 OS X 用户遇到这个问题,OS X 中的语法略有不同。假设您不想在以下子目录中递归搜索path_A

find path_A -maxdepth 1 -name "*AAA*" -exec mv {} path_B \;

如果您想递归搜索所有文件path_A

find path_A -name "*AAA*" -exec mv {} path_B \;

答案4

仅使用POSIX 的特点find(和还属于mv):

find path_A -name '*AAA*' -exec sh -c 'mv "$@" path_B' find-sh {} +

进一步阅读:

相关内容