特定のディレクトリ構造をコピーし、それとともにコピーするファイルの数をランダムに選択する、エレガントで高速な方法はありますか。たとえば、次のような構造があるとします。
--MainDir
--SubDir1
--SubSubDir1
--file1
--file2
--...
--fileN
--...
--SubSubDirN
--file1
--file2
--...
--fileN
--...
フォルダー構造全体をコピーしたいのですが、各 SubSubDir の {files1-filesN} から特定の数のランダム ファイルのみを選択してコピーします。
答え1
これを GNU ユーティリティとしてタグ付けしたので、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
) を見つけ、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
ターゲット ディレクトリに置き換えるか、3 番目のスクリプト オプションを使用します。
この概念実証はテスト ディレクトリ内で実行されていますが、改善すべき点はたくさんあるかもしれません。