是否有一种优雅而快速的方法来复制某个目录结构,并仅选择随机数量的文件进行复制。例如你有这样的结构:
--MainDir
--SubDir1
--SubSubDir1
--file1
--file2
--...
--fileN
--...
--SubSubDirN
--file1
--file2
--...
--fileN
--...
我想复制整个文件夹结构,但仅从每个 SubSubDir 的 {files1-filesN} 中选择特定数量的随机文件进行复制。
答案1
既然你将其标记为linux
我将假设 GNU 实用程序。
将目录结构从$src
复制到$dest
:
find "$src" -type d -print0 | cpio -padmv0 "$dest"
$nfile
还从以下每个叶子目录复制文件的随机样本$src
:
find "$src" -type d -links 2 -exec \
sh -c 'find "$1" -type f -print0 | shuf -z -n "$2"' sh {} "$nfiles" \; | \
cpio -padmv0 "$dest"
这里第一个find
查找叶子目录 ( -links 2
),然后第二个find
查找每个子目录中的文件。 shuf
选择随机的文件样本,最后cpio
复制它们。
答案2
首先找到所有目录:
find MainDir -type d
然后将这些目录解析为脚本
find MainDir -type d -exec ./randomCopy.sh 2 {} \;
, 哪个
- 创建目标目录
- 复制随机数量的文件。
在本例中,将复制 2 个随机文件。
在我的示例中,脚本randomCopy.sh
如下所示:
#!/bin/bash
cnt="$1"
dir="$2"
mkdir -p "TARGET/$dir"
# see: https://stackoverflow.com/questions/414164/how-can-i-select-random-files-from-a-directory-in-bash
find "$dir" -maxdepth 1 -type f | sort -R | tail -n $cnt | while read file; do
# copy the file
cp "$file" "TARGET/$dir/"
done
并且不要忘记使脚本可执行:chmod +x randomCopy.sh
。
将字符串替换TARGET
为目标目录或使用第三个脚本选项。
这个概念验证正在我的测试目录中运行,但可能还有很多需要改进的地方。