![从一个目录中选择n个随机文件并将它们复制到另一个文件夹+具有相同但不同文件类型的其他文件](https://linux22.com/image/208941/%E4%BB%8E%E4%B8%80%E4%B8%AA%E7%9B%AE%E5%BD%95%E4%B8%AD%E9%80%89%E6%8B%A9n%E4%B8%AA%E9%9A%8F%E6%9C%BA%E6%96%87%E4%BB%B6%E5%B9%B6%E5%B0%86%E5%AE%83%E4%BB%AC%E5%A4%8D%E5%88%B6%E5%88%B0%E5%8F%A6%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%E5%A4%B9%2B%E5%85%B7%E6%9C%89%E7%9B%B8%E5%90%8C%E4%BD%86%E4%B8%8D%E5%90%8C%E6%96%87%E4%BB%B6%E7%B1%BB%E5%9E%8B%E7%9A%84%E5%85%B6%E4%BB%96%E6%96%87%E4%BB%B6.png)
我有两个目录,我们称它们为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
该脚本未经测试,但应该执行您想要的操作。将X
、Y
和Z
变量设置为正确的值,然后运行它以查看它会做什么,根据需要进行调整,当它按要求工作时,echo
从两行中删除cp
。
$files
它的工作原理是首先使用目录中的 10 个随机 .jpg 文件名填充数组 ( ) $X
。它使用 NUL 作为文件名分隔符,因此适用于任何文件名,甚至包括空格、制表符和 shell 元字符等烦人的字符。
然后它迭代每个文件名以 1. 将它们复制到目录$Z
,2. 提取文件名的基本名称部分, 3. 将基本名称 +.txt
从目录复制$Y
到目录$Z
。
顺便说一句,这需要 bash 版本 4.4-alpha(2015 年末发布)或更高版本,因为那时该-d
选项被添加到mapfile
.