复制具有随机数量文件的目录结构

复制具有随机数量文件的目录结构

是否有一种优雅而快速的方法来复制某个目录结构,并仅选择随机数量的文件进行复制。例如你有这样的结构:

--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 {} \;

, 哪个

  1. 创建目标目录
  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为目标目录或使用第三个脚本选项。

这个概念验证正在我的测试目录中运行,但可能还有很多需要改进的地方。

相关内容