从一个目录中选择n个随机文件并将它们复制到另一个文件夹+具有相同但不同文件类型的其他文件

从一个目录中选择n个随机文件并将它们复制到另一个文件夹+具有相同但不同文件类型的其他文件

我有两个目录,我们称它们为X 其中我有 100k+ 文件,.jpg 文件X和 .txt 文件

我想随机选择文件来自X并复制到文件夹Z

这应该可以使用 find + shuffle 来管理。

然后我想找到其中的所有文件与复制到的文件同名Z,但它们是.txt文件并将它们复制到目录

可视化:N 个文件X>>Z 相同的 N 个文件>>

我该怎么做呢?

答案1

#!/bin/bash

X=/path/to/X
Y=/path/to/Y
Z=/path/to/Z

mapfile -d '' -t files < <(find "$X" -type f -name '*.jpg' -print0 |
                           shuf -z -n 10 -)

for f in "${files[@]}"; do
  echo cp "$f" "$Z"
  bn=$(basename "$f" ".jpg")
  echo cp "$Y/$bn.txt" "$Z"
done

该脚本未经测试,但应该执行您想要的操作。将XYZ变量设置为正确的值,然后运行它以查看它会做什么,根据需要进行调整,当它按要求工作时,echo从两行中删除cp

$files它的工作原理是首先使用目录中的 10 个随机 .jpg 文件名填充数组 ( ) $X。它使用 NUL 作为文件名分隔符,因此适用于任何文件名,甚至包括空格、制表符和 shell 元字符等烦人的字符。

然后它迭代每个文件名以 1. 将它们复制到目录$Z,2. 提取文件名的基本名称部分, 3. 将基本名称 +.txt从目录复制$Y到目录$Z

顺便说一句,这需要 bash 版本 4.4-alpha(2015 年末发布)或更高版本,因为那时该-d选项被添加到mapfile.

相关内容