随机选取文件夹中 30% 的文件

随机选取文件夹中 30% 的文件

我有许多文件夹,每个文件夹中都有音频文件。我想挑选每个文件的 30% 并将它们剪切(而不是复制)到另一个文件夹。我可以看到这个帖子鉴于我知道每个文件夹中的文件数量,这可以帮助我做到这一点。遗憾的是这个数字可能会改变,我想要一个可以做到这一点的单个管道 bash 行。这可能吗?如何选择 30% 的文件并将其剪切到另一个文件夹?

答案1

bash4.4+ 和 GNU 系统上,您可以执行以下操作:

readarray -td '' files < <(
  shopt -s nullglob dotglob
  printf '%s\0' * | sort -Rz
)

$files使用当前目录中所有文件的随机列表填充数组。

然后你可以使用以下命令移动其中的 30%:

echo mv -- "${files[@]:0:${#files[@]}*30/100}" /target/directory/

echo当您满意它会做您想做的事情时,请删除)。

shell中的等效内容zsh可能类似于:

files=(*(NDnoe['REPLY=$RANDOM']))
echo mv -- $files[1,$#files*30/100] /target/directory/

这是相同的方法,只是更简洁并且不需要外部实用程序。翻译:

  • shopt -s nullglob-> Nglob 限定符(没有文件时创建一个空数组)。
  • shopt -s dotglob-> Dglob 限定符(不排除名称以点开头的文件)。
  • GNU sort -Rz:(noe['REPLY=$RANDOM']通过使用随机顺序排序来打乱列表)。
  • ${array[@]:offset:length}-> $array[first,last](zsh 现在也支持 Korn shell 语法,但我发现 zsh 更清晰)。
  • 我们bash使用 NUL 分隔记录(-d ''/ -z/ \0)来处理任意文件名。不需要它,zsh因为列表永远不会转换为单个字符串/流。

答案2

ls | shuf -n $(( $(ls | wc -l) *  30 / 100))

您所需要做的就是分别查找文件数量和百分比。为了这

  1. $(ls | wc -l)会首先计算目录中的文件数量
  2. $(( x * 30 /100))将进行算术运算,找到该数字的 30%
  3. 最后,将该数字传递给以shuf -n获取随机文件列表。

相关内容