如何根据文件名将每三天的文件移动到bash中的相应文件夹

如何根据文件名将每三天的文件移动到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

相关内容