34

我有以下命令:

find . -type d -mtime 0 -exec mv {} /path/to/target-dir \;

这会将创建的目录移动到另一个目录。我怎样才能使用xargs而不是exec做同样的事情。

4

5 回答 5

42

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

find . -name some_pattern -print0 | xargs -0 -J % mv % target_location

这会将任何匹配some_pattern的东西.移到target_location

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

find . -name some_pattern -print0 | xargs -0 -I % mv % target_location

-iGNU xargs的 deprecated选项暗示-I{}并且可以按如下方式使用:

find . -name some_pattern -print0 | xargs -0 -i mv {} target_location

请注意,BSD xargs 也有一个-I选项,但它还有其他作用。

于 2013-07-20T16:53:02.783 回答
40

如果你有 GNU mv(and findand xargs),你可以使用-t选项 to mv(and -print0for findand -0for xargs):

find . -type d -mtime -0 -print0 | xargs -0 mv -t /path/to/target-dir

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

find . -type d -mtime -0 -exec mv -t /path/to/target-dir {} +

这使得将find方便数量的文件(目录)名称组合到程序的单个调用中。您无法控制传递给mvxargs提供的参数数量,但您实际上很少需要它。这仍然取决于-tGNU 的选项mv

于 2012-12-16T08:42:07.810 回答
4
find ./ -maxdepth 1 -name "some-dir" -type d -print0 | xargs -0r mv -t x/

find:使用 option -print0,输出将以 '\0' 结尾;

xargs:使用 option -0,它会将 args 拆分为 '\0' 但空格,-r表示 no-run-if-empty,因此如果find没有得到任何输出,您将不会收到任何错误。(这-r是一个 GNU 扩展。)

当我不确定目标文件是否存在时,我通常在脚本中使用它。

于 2014-03-13T09:19:10.317 回答
2

find这不是一个很好的工具。我想您想将所有子目录移动到另一个目录中。find会输出类似的东西

./a
./a/b
./a/b/c
./a/b/c/d

首先移动后./a,您只会收到有关“没有这样的文件或目录”所有子目录的错误。

您应该只使用mv */ /another/place-- 通配符上的尾部斜杠将扩展限制为仅 dirs。

于 2013-07-20T02:23:09.530 回答
0

如果您不使用 GNU mv,则可以使用该命令:

find . -depth -type d -mtime 0 -exec bash -c 'declare -a array;j=1;for i; do array[$j]="$i"; j=$((j+1));done; mv "${array[*]}" /path/to/target-dir' arg0 {} +

否则,这是一个不需要 xargs 的更简单的解决方案:

find . -depth -type d -mtime 0 -exec mv -t /path/to/target-dir {} +

请注意,我添加了 -depth 否则在同时处理目录及其子目录之一时会出现错误。

于 2012-12-16T09:37:56.343 回答