我有以下命令:
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
-iGNU xargs的 deprecated选项暗示-I{}并且可以按如下方式使用:
find . -name some_pattern -print0 | xargs -0 -i mv {} target_location
请注意,BSD xargs 也有一个-I选项,但它还有其他作用。
如果你有 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方便数量的文件(目录)名称组合到程序的单个调用中。您无法控制传递给mv该xargs提供的参数数量,但您实际上很少需要它。这仍然取决于-tGNU 的选项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 否则在同时处理目录及其子目录之一时会出现错误。