ファイル名に基づいて3日ごとにファイルをbashの適切なフォルダに移動する方法

ファイル名に基づいて3日ごとにファイルをbashの適切なフォルダに移動する方法

次のファイルがいくつかあります。

2020.001.00.01.pcc1_TBTZ_TBTZ_1.0-3.0.sac
2020.001.03.04.pcc1_TBTZ_TBTZ_1.0-3.0.sac
2020.002.00.01.pcc1_TBTZ_TBTZ_1.0-3.0.sac
2020.003.00.01.pcc1_TBTZ_TBTZ_1.0-3.0.sac
2020.004.00.01.pcc1_TBTZ_TBTZ_1.0-3.0.sac
2020.004.05.06.pcc1_TBTZ_TBTZ_1.0-3.0.sac
2020.005.00.01.pcc1_TBTZ_TBTZ_1.0-3.0.sac
2020.006.00.01.pcc1_TBTZ_TBTZ_1.0-3.0.sac
...
2020.366.00.01.pcc1_TBTZ_TBTZ_1.0-3.0.sac

ファイルはyear.day.hour1.hour2...重要なパラメータは年と日です。日付範囲は001から366(または365)です。

私が望むのは、私のファイル(フォルダとファイル)をこのように整理することです。したがって、フォルダを作成し、そのファイルをフォルダに移動します。

2020.001.003 - 2020.001.00.01.pcc1_TBTZ_TBTZ_1.0-3.0.sac
               2020.001.03.04.pcc1_TBTZ_TBTZ_1.0-3.0.sac
               2020.002.00.01.pcc1_TBTZ_TBTZ_1.0-3.0.sac
               2020.003.00.01.pcc1_TBTZ_TBTZ_1.0-3.0.sac

2020.004.006 - 2020.004.00.01.pcc1_TBTZ_TBTZ_1.0-3.0.sac
               2020.004.05.06.pcc1_TBTZ_TBTZ_1.0-3.0.sac
               2020.005.00.01.pcc1_TBTZ_TBTZ_1.0-3.0.sac
               2020.006.00.01.pcc1_TBTZ_TBTZ_1.0-3.0.sac

366日目にファイルが完了するまで続きます。

私がしたこと(望むように動作しません):

for file in *.sac
do
year=`echo "$file" | awk -F"." '{print $1}'`
day=`echo "$file" | awk -F"." '{print $2}'`
dayi=$day
dayf="366"
#
# Moving every three day files
delta=2
x1=$dayi
x2=$(echo "$x1+$delta" | bc)
if [ $x1 -lt $x2 ]
then
echo $x1 $x2
dir=$(echo "$year"."$x1"."$x2")
mkdir $dir
x1=$(( x1+3))
x2=$(( x1+delta))
fi
done

その結果、コードは次のフォルダを生成します。

2020.001.3
2020.002.4
2020.003.5
...

デフォルトでは不要なフォルダを作成しています。また、ファイルをフォルダに移動する方法がまだわかりません。

ご協力ありがとうございます。

ベストアンサー1

bashの機能を使用すると、すべてがより簡単になります。

#!/bin/bash
for file in *.sac
do
    year=${file:0:4}
    day=${file:5:3}
    
    range_start=$(( (($day-1)/3)*3+1 ))
    range_end=$(( $range_start+2 ))
    
    ndir=$(printf "%04d.%03d.%03d" $year $range_start $range_end)

    mkdir -p archive/$ndir
    mv $file archive/$ndir/
done

おすすめ記事