将一定数量的某种文件类型从一个目录随机复制到另一个目录中

Dav*_*ost 13 command-line cp random

有时我有一个装满jpg的文件夹,我需要随机选择8个左右。我如何自动执行此操作,以便我的帐户从文件夹中随机选择 8 个 jpg 并将它们复制到另一个目的地?

我的问题真的很简单cp,我想构建一个脚本,随机选择文件夹中的 8 个 .jpg,并将它们复制到另一个文件夹,而不是使用并为其指定文件名和目标文件名。

cha*_*aos 30

你可以使用shuf

shuf -zn8 -e *.jpg | xargs -0 cp -vt target/
Run Code Online (Sandbox Code Playgroud)
  • shuf打乱*.jpg当前目录中的文件列表。
  • -z 是零终止每一行,以便正确处理带有特殊字符的文件。
  • -n8shuf8 个文件后退出。
  • xargs -0读取由空字符 (from shuf -z)分隔的输入并运行cp.
  • -v 是详细打印每个副本。
  • -t 是指定目标目录。


小智 8

最好的答案绝对不适合我,因为-e *.jpg 实际上并没有查看工作目录。这只是一个表达。所以shuf不洗牌任何东西......

根据我在那篇文章中学到的知识,我发现了以下改进。

find /some/dir/ -type f -name "*.jpg" -print0 | xargs -0 shuf -e -n 8 -z | xargs -0 cp -vt /target/dir/
Run Code Online (Sandbox Code Playgroud)

  • `-e *.jpg` 需要当前目录中的一组匹配文件。如果没有匹配项,它(通常)将单个文字“*.jpg”返回到“shuf”,然后“shuf”只需要考虑一个元素。 (4认同)
  • 感谢您提供这个解决方案;它适用于大量文件,而不是公认的解决方案。 (2认同)
  • 至少在 Macos 12.6 上,“xargs”将为每 5000 个输入项执行“shuf”。因此,使用此方法您可能会轻松获得超出预期的结果。 (2认同)

小智 1

您可以通过以下方式检索文件:

files=(/tmp/*.jpg)
n=${#files[@]}
file_to_retrieve="${files[RANDOM % n]}"
cp $file_to_retrieve <destination>
Run Code Online (Sandbox Code Playgroud)

循环8次。