ディレクトリ名の共通部分があるディレクトリ内のファイルにアクセスする最良の方法

ディレクトリ名の共通部分があるディレクトリ内のファイルにアクセスする最良の方法

タイトルが完全に自明なのにどのように表現すべきかわかりませんね。たとえば、説明します。

次のディレクトリ構造があります。

  • 結果/

       test_0_part1_x000/
       test_0_part2_x010/
       test_0_part3_x122/
       test_1_part1_x121/
       test_1_part2_x009/ 
            ....
    

など。デフォルトでは、約500のディレクトリを含む結果/ディレクトリがあります。これらのディレクトリはテストごとに「グループ化」されているため、すべてのtest_0_part *ディレクトリは同じテストプラットフォームを参照します(約50のテストがあると仮定すると、test_0_ *からtest_49_ *ディレクトリがあります)。

各ディレクトリからファイルを収集し、ディレクトリにグループ化する必要があります。ディレクトリがtest_0の場合は、test_0 /で、test_0_part *ディレクトリのすべてのファイルを含める必要があります。

実際、私のアプローチは、result /のすべてのディレクトリを繰り返し、ディレクトリ名を比較してファイルを正しい最終ディレクトリに収集することです。動作しますが、問題を処理するために正規表現や同様のものを使用できるため、まったくスマートには見えません。残念ながら、私のbashスクリプトと一般的なbashの理解はまだ非常に基本的であり、コードを改善するために何を見なければならないのかわかりません。すべてのファイルを順番に繰り返すよりも安全なファイルの選択とコピーを実行するために正規表現を利用したいと思います。

私のコードは次のとおりです

    #! /bin/bash
    OUTDIR=""  #output dir - where to place the files from same test
    INFILES=""  #collection of input files for each test

    last_dir="" 
    #iterate through all the directories in result/
    for d in */; do

    subdirname=${d%???????????} #getting only the first part of dir name (i.e. test0, test1, etc)

    #if new directory is different from the last one, then it is related to a new test. move alle the files collected so far to the OUTDIR directory and clean the OUTDIR content
    if [[ "$last_dir" != "$subdirname" &&  ! -z "$last_dir" ]]; then                
            echo "copying for $last_dir test:"
            echo "$INFILES" | tr " " "\n"
            echo "output directory: $OUTDIR"
            mkdir ${OUTDIR}
            mv ${INFILES} ${OUTDIR}/
            OUTDIR=""
    fi
    
    #if output dir is empty, then get the name from the current dir and clean the input files list 
    if [ -z "$OUTDIR" ]; then
            OUTDIR=${subdirname}
            INFILES=""
    fi
    
    # collect file(s) in the current directory and append to the list
    for fname in ${d}*;
    do
            INFILES="${INFILES} ${fname}"
    done

    last_dir=${subdirname}

    done

助けてくれてありがとう!

答え1

、を使用して、zshすべてのファイルを次の場所に移動します。test_n_part*/*test_n

autoload zmv
mkmv() {mkdir -p -- $2:h && mv -- "$@"}

zmv -n -P mkmv '(test_<->)_part*/(*)' '$1/$2'

-n必要に応じてテストを実行するために削除)。

(#qD)ソースモードに追加すると、隠しファイルも移動されます。

関連情報