파일 이름을 기준으로 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

답변2

에서는 일괄 이름 바꾸기를 사용하여 이 작업을 수행 zsh할 수 있습니다 zmv.

autoload -Uz zmv
mkmv() { mkdir -p -- $2:h && mv -- "$@"; }
zmv -n -P mkmv '(<->.)(<1-366>).*.sac' \
               '$1${(l[3][0])$(( start = ($2 - 1) / 3 * 3 + 1 ))}.${(l[3][0])$(( start + 2 ))}/$f'

( -n만족하면 삭제(테스트 실행)).

이는 다음을 제공합니다:

mkmv 2020.001.00.01.pcc1_TBTZ_TBTZ_1.0-3.0.sac 2020.001.003/2020.001.00.01.pcc1_TBTZ_TBTZ_1.0-3.0.sac
mkmv 2020.001.03.04.pcc1_TBTZ_TBTZ_1.0-3.0.sac 2020.001.003/2020.001.03.04.pcc1_TBTZ_TBTZ_1.0-3.0.sac
mkmv 2020.002.00.01.pcc1_TBTZ_TBTZ_1.0-3.0.sac 2020.001.003/2020.002.00.01.pcc1_TBTZ_TBTZ_1.0-3.0.sac
mkmv 2020.003.00.01.pcc1_TBTZ_TBTZ_1.0-3.0.sac 2020.001.003/2020.003.00.01.pcc1_TBTZ_TBTZ_1.0-3.0.sac
mkmv 2020.004.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
mkmv 2020.004.05.06.pcc1_TBTZ_TBTZ_1.0-3.0.sac 2020.004.006/2020.004.05.06.pcc1_TBTZ_TBTZ_1.0-3.0.sac
mkmv 2020.005.00.01.pcc1_TBTZ_TBTZ_1.0-3.0.sac 2020.004.006/2020.005.00.01.pcc1_TBTZ_TBTZ_1.0-3.0.sac
mkmv 2020.006.00.01.pcc1_TBTZ_TBTZ_1.0-3.0.sac 2020.004.006/2020.006.00.01.pcc1_TBTZ_TBTZ_1.0-3.0.sac
mkmv 2020.366.00.01.pcc1_TBTZ_TBTZ_1.0-3.0.sac 2020.364.366/2020.366.00.01.pcc1_TBTZ_TBTZ_1.0-3.0.sac

관련 정보