以下のように多くのサブフォルダがあるディレクトリがあります(FAとT1のコンテンツがペアになっており、..._L、..._Rのコンテンツがあることを覚えておいてください)。ここで、文字(a、b、cなど)で指定されたフォルダの数は大きく異なる場合があります。
.
├── FA
│ ├── CN
│ │ ├── CN_L
│ │ │ ├── GE_FSPGR
│ │ │ │ ├── a
│ │ │ │ └── b
│ │ │ ├── PHILIPS_MPRAGE
│ │ │ │ ├── c
│ │ │ │ └── d
│ │ │ └── SIEMENS_MPRAGE
│ │ │ ├── e
│ │ │ ├── f
│ │ │ ├── g
│ │ │ └── h
│ │ └── CN_R
│ │ ├── GE_FSPGR
│ │ │ ├── a
│ │ │ └── b
│ │ ├── PHILIPS_MPRAGE
│ │ │ ├── c
│ │ │ └── d
│ │ └── SIEMENS_MPRAGE
│ │ ├── e
│ │ ├── f
│ │ ├── g
│ │ └── h
│ └── Dementia
│ ├── Dementia_L
│ │ ├── GE_FSPGR
│ │ │ ├── i
│ │ │ └── j
│ │ ├── PHILIPS_MPRAGE
│ │ │ ├── k
│ │ │ └── l
│ │ └── SIEMENS_MPRAGE
│ │ ├── m
│ │ ├── n
│ │ ├── o
│ │ └── p
│ └── Dementia_R
│ ├── GE_FSPGR
│ │ ├── i
│ │ └── j
│ ├── PHILIPS_MPRAGE
│ │ ├── k
│ │ └── l
│ └── SIEMENS_MPRAGE
│ ├── m
│ ├── n
│ ├── o
│ └── p
└── T1
├── CN
│ ├── CN_L
│ │ ├── GE_FSPGR
│ │ │ ├── a
│ │ │ └── b
│ │ ├── PHILIPS_MPRAGE
│ │ │ ├── c
│ │ │ └── d
│ │ └── SIEMENS_MPRAGE
│ │ ├── e
│ │ ├── f
│ │ ├── g
│ │ └── h
│ └── CN_R
│ ├── GE_FSPGR
│ │ ├── a
│ │ └── b
│ ├── PHILIPS_MPRAGE
│ │ ├── c
│ │ └── d
│ └── SIEMENS_MPRAGE
│ ├── e
│ ├── f
│ ├── g
│ └── h
└── Dementia
├── Dementia_L
│ ├── GE_FSPGR
│ │ ├── i
│ │ └── j
│ ├── PHILIPS_MPRAGE
│ │ ├── k
│ │ └── l
│ └── SIEMENS_MPRAGE
│ ├── m
│ ├── n
│ ├── o
│ └── p
└── Dementia_R
├── GE_FSPGR
│ ├── i
│ └── j
├── PHILIPS_MPRAGE
│ ├── k
│ └── l
└── SIEMENS_MPRAGE
├── m
├── n
├── o
└── p
このディレクトリをパーセンテージに基づいてテスト、学習、検証に分割したいと思います。つまり、サブフォルダ(a、b、c、dなどもフォルダ)の60%、20%、20%をインポートしてコピーします。同じ親フォルダと同じペアリング構造を維持しながら、そのコレクション(学習、テスト、または検証)に接続します。私が明らかに言ったのか分からない。
出力は次のとおりです。
.
├── test
│ ├── FA
│ │ ├── CN
│ │ │ ├── CN_L
│ │ │ │ ├── GE_FSPGR
│ │ │ │ │ ├── a
│ │ │ │ ├── PHILIPS_MPRAGE
│ │ │ │ │ ├── c
│ │ │ │ └── SIEMENS_MPRAGE
│ │ │ │ ├── e
│ │ │ │ ├── f
│ │ │ └── CN_R
│ │ │ ├── GE_FSPGR
│ │ │ │ ├── a
│ │ │ ├── PHILIPS_MPRAGE
│ │ │ │ ├── c
│ │ │ └── SIEMENS_MPRAGE
│ │ │ ├── e
│ │ │ ├── f
│ │ └── Dementia
│ │ ├── Dementia_L
│ │ │ ├── GE_FSPGR
│ │ │ │ ├── i
│ │ │ ├── PHILIPS_MPRAGE
│ │ │ │ ├── k
│ │ │ └── SIEMENS_MPRAGE
│ │ │ ├── m
│ │ │ ├── n
│ │ └── Dementia_R
│ │ ├── GE_FSPGR
│ │ │ ├── i
│ │ ├── PHILIPS_MPRAGE
│ │ │ ├── k
│ │ └── SIEMENS_MPRAGE
│ │ ├── m
│ │ ├── n
│ └── T1
│ ├── CN
│ │ ├── CN_L
│ │ │ ├── GE_FSPGR
│ │ │ │ ├── a
│ │ │ ├── PHILIPS_MPRAGE
│ │ │ │ ├── c
│ │ │ └── SIEMENS_MPRAGE
│ │ │ ├── e
│ │ │ ├── f
│ │ └── CN_R
│ │ ├── GE_FSPGR
│ │ │ ├── a
│ │ ├── PHILIPS_MPRAGE
│ │ │ ├── c
│ │ └── SIEMENS_MPRAGE
│ │ ├── e
│ │ ├── f
│ └── Dementia
│ ├── Dementia_L
│ │ ├── GE_FSPGR
│ │ │ ├── i
│ │ ├── PHILIPS_MPRAGE
│ │ │ ├── k
│ │ └── SIEMENS_MPRAGE
│ │ ├── m
│ │ ├── n
│ └── Dementia_R
│ ├── GE_FSPGR
│ │ ├── i
│ ├── PHILIPS_MPRAGE
│ │ ├── k
│ └── SIEMENS_MPRAGE
│ ├── m
│ ├── n
├── train
│ ├── FA
│ │ ├── CN
│ │ │ ├── CN_L
│ │ │ │ ├── GE_FSPGR
│ │ │ │ │ ├── b
│ │ │ │ ├── PHILIPS_MPRAGE
│ │ │ │ │ ├── d
│ │ │ │ └── SIEMENS_MPRAGE
│ │ │ │ ├── g
│ │ │ │ ├── h
│ │ │ └── CN_R
│ │ │ ├── GE_FSPGR
│ │ │ │ ├── b
│ │ │ ├── PHILIPS_MPRAGE
│ │ │ │ ├── d
│ │ │ └── SIEMENS_MPRAGE
│ │ │ ├── g
│ │ │ ├── h
│ │ └── Dementia
│ │ ├── Dementia_L
│ │ │ ├── GE_FSPGR
│ │ │ │ ├── j
│ │ │ ├── PHILIPS_MPRAGE
│ │ │ │ ├── l
│ │ │ └── SIEMENS_MPRAGE
│ │ │ ├── o
│ │ │ ├── p
│ │ └── Dementia_R
│ │ ├── GE_FSPGR
│ │ │ ├── j
│ │ ├── PHILIPS_MPRAGE
│ │ │ ├── l
│ │ └── SIEMENS_MPRAGE
│ │ ├── o
│ │ ├── p
│ └── T1
│ ├── CN
│ │ ├── CN_L
│ │ │ ├── GE_FSPGR
│ │ │ │ ├── b
│ │ │ ├── PHILIPS_MPRAGE
│ │ │ │ ├── d
│ │ │ └── SIEMENS_MPRAGE
│ │ │ ├── g
│ │ │ ├── h
│ │ └── CN_R
│ │ ├── GE_FSPGR
│ │ │ ├── b
│ │ ├── PHILIPS_MPRAGE
│ │ │ ├── d
│ │ └── SIEMENS_MPRAGE
│ │ ├── g
│ │ ├── h
│ └── Dementia
│ ├── Dementia_L
│ │ ├── GE_FSPGR
│ │ │ ├── j
│ │ ├── PHILIPS_MPRAGE
│ │ │ ├── l
│ │ └── SIEMENS_MPRAGE
│ │ ├── o
│ │ ├── p
│ └── Dementia_R
│ ├── GE_FSPGR
│ │ ├── j
│ ├── PHILIPS_MPRAGE
│ │ ├── l
│ └── SIEMENS_MPRAGE
│ ├── o
│ ├── p
└── validation
├── FA
│ ├── CN
│ │ ├── CN_L
│ │ │ ├── GE_FSPGR
│ │ │ │ ├── aa
│ │ │ ├── PHILIPS_MPRAGE
│ │ │ │ ├── bb
│ │ │ └── SIEMENS_MPRAGE
│ │ │ ├── cc
│ │ │ ├── dd
│ │ └── CN_R
│ │ ├── GE_FSPGR
│ │ │ ├── aa
│ │ ├── PHILIPS_MPRAGE
│ │ │ ├── bb
│ │ └── SIEMENS_MPRAGE
│ │ ├── cc
│ │ ├── dd
│ └── Dementia
│ ├── Dementia_L
│ │ ├── GE_FSPGR
│ │ │ ├── ee
│ │ ├── PHILIPS_MPRAGE
│ │ │ ├── ff
│ │ └── SIEMENS_MPRAGE
│ │ ├── gg
│ │ ├── hh
│ └── Dementia_R
│ ├── GE_FSPGR
│ │ ├── ee
│ ├── PHILIPS_MPRAGE
│ │ ├── ff
│ └── SIEMENS_MPRAGE
│ ├── gg
│ ├── hh
└── T1
├── CN
│ ├── CN_L
│ │ ├── GE_FSPGR
│ │ │ ├── aa
│ │ ├── PHILIPS_MPRAGE
│ │ │ ├── bb
│ │ └── SIEMENS_MPRAGE
│ │ ├── cc
│ │ ├── dd
│ └── CN_R
│ ├── GE_FSPGR
│ │ ├── aa
│ ├── PHILIPS_MPRAGE
│ │ ├── bb
│ └── SIEMENS_MPRAGE
│ ├── cc
│ ├── dd
└── Dementia
├── Dementia_L
│ ├── GE_FSPGR
│ │ ├── ee
│ ├── PHILIPS_MPRAGE
│ │ ├── ff
│ └── SIEMENS_MPRAGE
│ ├── gg
│ ├── hh
└── Dementia_R
├── GE_FSPGR
│ ├── ee
├── PHILIPS_MPRAGE
│ ├── ff
└── SIEMENS_MPRAGE
├── gg
├── hh
私は本当に何をすべきかわかりません。私を助けてくれてありがとう。
私はこの記事を読みました。サブフォルダを介して何千ものファイルを配布するしかし、私の問題には適していないと思います。
ありがとう
答え1
これ住宅検査-clean Bashプログラムはあなたのニーズに合うことができます:
#! /bin/bash -p
#### Utility functions
function quit
{
local -r msg=${1-unknown error}
printf '%s: ERROR: %s\n' "$0" "$msg" >&2
exit 1
}
# Do a random shuffle of the 'dirs' array
# (Code adapted from "BashFAQ/026 - Greg's Wiki",
# <https://mywiki.wooledge.org/BashFAQ/026>)
function shuffle_dirs
{
local i tmp size max rand
size=${#dirs[@]}
for ((i=size-1; i>0; i--)); do
# RANDOM % (i+1) is biased because of the limited range of $RANDOM
# Compensate by using a range which is a multiple of the rand modulus.
max=$(( 32768 / (i+1) * (i+1) ))
while (( (rand=RANDOM) >= max )); do :; done
rand=$(( rand % (i+1) ))
tmp=${dirs[i]} dirs[i]=${dirs[rand]} dirs[rand]=$tmp
done
return 0
}
# Copy an FA/..._L/... directory and directories paired with it under $srcdir
# to a "split" directory ('test', 'train', or 'validation') under $destdir
function copy_dirs
{
local -r splitdir=$1 # 'test', 'train', or 'validation'
local -r fa_l_dir=$2 # E.g. 'FA/CN/CN_L/GE_FSPGR/b'
local -a parts
local p0 p2 path
IFS=/ read -r -a parts <<<"$fa_l_dir"
for p0 in FA T1; do
for p2 in "${parts[2]}" "${parts[2]%_L}_R"; do
path="$p0/${parts[1]}/$p2/${parts[3]}/${parts[4]}"
srcpath="$srcdir/$path"
destpath="$destdir/$splitdir/$path"
mkdir --parents --verbose -- "${destpath%/*}"
cp --archive --verbose -- "$srcpath" "$destpath"
done
done
return 0
}
#### "main"
if (( $# != 2 )); then
printf 'usage: %s SRCDIR DESTDIR\n' "$0" >&2
exit 1
fi
declare -r srcdir=$1
declare -r destdir=$2
# Check for existence of required directories
for d in "$srcdir" "$srcdir/FA" "$srcdir/T1" "$destdir"; do
[[ -e $d ]] || quit "'$d' does not exist"
[[ -d $d ]] || quit "'$d' is not a directory"
done
shopt -s nullglob
for groupdir in "$srcdir"/FA/*/*_L/*/; do
# Get the list of FA/..._L/group/... directories to be copied
dirs=()
for d in "$groupdir"*; do
dirs+=( "${d#"$srcdir/"}" )
done
ndirs=${#dirs[*]}
if (( ndirs == 0 )); then
printf "%s: WARNING: no directories match '$groupdir*'\\n" "$0" >&2
continue
fi
# Randomly shuffle the list of directories to randomize which directories
# get copied to which locations
shuffle_dirs
declare -i pc_sum=0 lo=0 hi
for splitdir_pc in test:60 train:20 validation:20; do
splitdir=${splitdir_pc%:*}
pc=${splitdir_pc#*:}
pc_sum+=$pc
hi='(ndirs * pc_sum + 50)/100 - 1'
for ((i=lo; i<=hi; i++)); do
copy_dirs "$splitdir" "${dirs[i]}"
done
lo='hi+1'
done
done
exit 0
- このプログラムは2つのコマンドラインパラメータを使用します。
FA
ディレクトリを含むディレクトリへのパスT1
。test
train
、およびディレクトリを含むディレクトリvalidation
(およびそのディレクトリがコピーされるディレクトリ)のパス。
- 興味がある場合は、コードに文書を追加するか、質問に答えてください。
答え2
パス名またはファイルの内容のハッシュを計算します。以下はハッシュ関数の例です。
$ date | shasum
7ae62fd4e6483c966fd23d8eeafabc934226914d -
最初の文字を取得します。... shasum | cut -c1
おおよその必要な割合に対応する16のシンボリックリンクを作成します。 3つの既存のディレクトリを指します。
ln -s /data/test 0
...
ln -s /data/test 9
ln -s /data/train a
ln -s /data/train b
ln -s /data/train c
ln -s /data/validate d
ln -s /data/validate e
ln -s /data/validate f
今は簡単です。ハッシュの初期文字とcp
ターゲットディレクトリのsrcファイルを取得します。
各カテゴリからおおよその正確な数のファイルを取得できます。 1/16より1/256の解像度を好む場合は、各ハッシュの最初の2文字のシンボリックリンクを自由に作成してください。
編集する
あなたはたくさんのファイルを持っていると言います。
FA/CN/CN_L/GE_FSPGR/a/one.csv
FA/CN/CN_L/GE_FSPGR/a/two.csv
...
FA/CN/CN_L/GE_FSPGR/a/one_hundred.csv
各ファイルに対してトレーニング、テスト、検証の3つの条件のいずれかを選択しようとしています。
ハッシュしよう特別なパス名:
$ echo FA/CN/CN_L/GE_FSPGR/a/one.csv | shasum
16930ea7216d650735ea7c223a67371c5a5ed770 -
$
$ echo FA/CN/CN_L/GE_FSPGR/a/one.csv | shasum | cut -c1
1
他のファイルに対してこの操作を繰り返すと、がd
作成されます2
。
「テスト」領域にリンクされ、その領域に到達し、$ cp one.csv 1
検証データの一部となる複数のシンボリックリンクが確立されました。$ cp one_hundred.csv 2
$ cp two.csv d