タイトルが完全に自明なのにどのように表現すべきかわかりませんね。たとえば、説明します。
次のディレクトリ構造があります。
結果/
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)
ソースモードに追加すると、隠しファイルも移動されます。