将 gshuf 的输出通过管道传输到 mv (Bash / OSX)

Pipe the output of gshuf to mv (Bash / OSX)

我很难将 gshuf 命令的输出传送到移动命令。我有一组包含 50 到 1,000 个文件的文件夹。我需要随机 select 它们的一个子集并将它们移动到另一个文件夹。我已经阅读了关于该主题的几个解决方案,但是正确传递所需的许多标志似乎不在 OSX 中(我已经通过 Homebrew 安装了 gshuf,因为默认情况下它不是 OSX ).

这是我目前拥有的(select当前目录中的 10 个随机文件并尝试将它们移动到我的目标文件夹但它不起作用):

gshuf -zen10 * | xargs mv -i my_destination_folder/

我想我没有正确使用 xargs 和/或 mv 标志。

感谢您的帮助!

目标目录必须是 POSIX mv 以及 BSD (macOS) mv 的最后一个参数。 GNU mv 有一个 -t target 选项,这意味着该目录可以在要删除的文件之前。

/opt/gnu/bin/mv -t my_destination_folder …

如果您只移动 10 个文件并且它们的名称中没有空格或其他特殊字符(如果它们坚持 POSIX portable file name character set),那么您应该能够用以下方法完成工作:

mv $(gshuf -zen10 *) my_destination_folder/

如果名称中有空格或其他特殊字符,那么我们必须重新考虑 — 除其他事项外,有必要了解 -zen10 选项与 gshuf。如果 -z 表示 'output null terminated data instead of newlines'(在 GNU 实用程序领域并不少见),那么您的 xargs 命令缺少 -0 选项。

您可能需要做一些适度复杂的事情,例如:

gshuf -zen10 * | xargs -0 -J % mv % my_destination_dir/

如果您要移动数千个文件,则必须担心命令行长度等问题。另一种选择是使用 Homebrew 安装 GNU 文件实用程序(具体为 mv),然后使用它mv-t 选项的变体:

gshuf -zen10 * | xargs mv -t my_destination_dir/

(同样,您可能需要一个 -0 选项来 xargs。)


找到 GNU 手册后 shuf

从 Core Utils 手册中挖掘 GNU shuf 的手册页,我们发现 -z 确实是用于空终止输出 'lines'。所以,xargs -0 是至关重要的。以及选项:

gshuf -zen10 * | xargs -0 -J % mv % my_destination_dir/

确实应该可以解决问题。我可能会将 -t 添加到 xargs,同时尝试监视它的作用。