使用xargs将目录从查找结果发送到另一个目录

zjh*_*hui 32 shell find xargs mv

我有以下命令:

find . -type d -mtime 0 -exec mv {} /path/to/target-dir \;
Run Code Online (Sandbox Code Playgroud)

这会将创建的目录移动到另一个目录.如何使用xargs而不是exec做同样的事情.

Jon*_*ler 39

如果你有GNU mv(和findxargs),你可以使用-t选项mv(和-print0for find-0for xargs):

find . -type d -mtime -0 -print0 | xargs -0 mv -t /path/to/target-dir
Run Code Online (Sandbox Code Playgroud)

请注意,现代版本find(与POSIX 2008兼容)支持+代替;和行为大致相同xargs而不使用xargs:

find . -type d -mtime -0 -exec mv -t /path/to/target-dir {} +
Run Code Online (Sandbox Code Playgroud)

这使得find组中方便的文件(目录)名称数量成为程序的单个调用.您没有对传递给mvxargs提供的参数数量的控制级别,但您实际上很少需要它.这仍然取决于-tGNU 的选项mv.

  • @ Sridhar-Sarnobat:`-print0`和`-0`方法甚至适用于包含换行符的文件名; 你的选择不是.当然,很少有文件在其名称中有换行符,但以空值终止的表示法的意思是它涵盖_all_文件名无例外. (3认同)
  • 很棒的提示.一个建议 - 使用xargs -d'\n'而不是使用那种凌乱的print0 ..- 0方法 (2认同)

小智 39

使用BSD xargs(适用于OS X和FreeBSD),您可以使用-J为此构建的:

find . -name some_pattern -print0 | xargs -0 -J % mv % target_location
Run Code Online (Sandbox Code Playgroud)

这将移动任何匹配some_pattern.target_location

使用GNU xargs(适用于Linux和Cygwin),请-I改用:

find . -name some_pattern -print0 | xargs -0 -I % mv % target_location
Run Code Online (Sandbox Code Playgroud)

-iGNU xargs 的弃用选项意味着-I{}可以使用如下:

find . -name some_pattern -print0 | xargs -0 -i mv {} target_location
Run Code Online (Sandbox Code Playgroud)

请注意,BSD xargs也有一个-I选项,但这样做会有所不同.