フォルダをサブフォルダに分割して親ディレクトリを維持し、パーセンテージに基づいています。端末の使用

フォルダをサブフォルダに分割して親ディレクトリを維持し、パーセンテージに基づいています。端末の使用

以下のように多くのサブフォルダがあるディレクトリがあります(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つのコマンドラインパラメータを使用します。
    1. FAディレクトリを含むディレクトリへのパスT1
    2. testtrain、およびディレクトリを含むディレクトリvalidation(およびそのディレクトリがコピーされるディレクトリ)のパス。
  • 興味がある場合は、コードに文書を追加するか、質問に答えてください。

おすすめ記事