我有以下命令:
find . -type d -mtime 0 -exec mv {} /path/to/target-dir \;
这会将创建的目录移动到另一个目录。我怎样才能使用xargs
而不是exec
做同样的事情。
使用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
-i
GNU xargs的 deprecated选项暗示-I{}
并且可以按如下方式使用:
find . -name some_pattern -print0 | xargs -0 -i mv {} target_location
请注意,BSD xargs 也有一个-I
选项,但它还有其他作用。
如果你有 GNU mv
(and find
and xargs
),你可以使用-t
选项 to mv
(and -print0
for find
and -0
for xargs
):
find . -type d -mtime -0 -print0 | xargs -0 mv -t /path/to/target-dir
请注意,现代版本find
(与 POSIX 2008 兼容)支持+
代替使用,并且行为与不使用;
大致相同:xargs
xargs
find . -type d -mtime -0 -exec mv -t /path/to/target-dir {} +
这使得将find
方便数量的文件(目录)名称组合到程序的单个调用中。您无法控制传递给mv
该xargs
提供的参数数量,但您实际上很少需要它。这仍然取决于-t
GNU 的选项mv
。
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 扩展。)
当我不确定目标文件是否存在时,我通常在脚本中使用它。
find
这不是一个很好的工具。我想您想将所有子目录移动到另一个目录中。find
会输出类似的东西
./a
./a/b
./a/b/c
./a/b/c/d
首先移动后./a
,您只会收到有关“没有这样的文件或目录”所有子目录的错误。
您应该只使用mv */ /another/place
-- 通配符上的尾部斜杠将扩展限制为仅 dirs。
如果您不使用 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 否则在同时处理目录及其子目录之一时会出现错误。