ランダムな数のファイルを含むディレクトリ構造をコピーする

ランダムな数のファイルを含むディレクトリ構造をコピーする

特定のディレクトリ構造をコピーし、それとともにコピーするファイルの数をランダムに選択する、エレガントで高速な方法はありますか。たとえば、次のような構造があるとします。

--MainDir
  --SubDir1
    --SubSubDir1
      --file1
      --file2
      --...
      --fileN
    --...
    --SubSubDirN
      --file1
      --file2
      --...
      --fileN
  --...

フォルダー構造全体をコピーしたいのですが、各 SubSubDir の {files1-filesN} から特定の数のランダム ファイルのみを選択してコピーします。

答え1

これを GNU ユーティリティとしてタグ付けしたので、linuxGNU ユーティリティであると想定します。

ディレクトリ構造を から にコピーし$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) を見つけ、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ターゲット ディレクトリに置き換えるか、3 番目のスクリプト オプションを使用します。

この概念実証はテスト ディレクトリ内で実行されていますが、改善すべき点はたくさんあるかもしれません。

関連情報