![如何根据文件名将每三天的文件移动到bash中的相应文件夹](https://linux22.com/image/218296/%E5%A6%82%E4%BD%95%E6%A0%B9%E6%8D%AE%E6%96%87%E4%BB%B6%E5%90%8D%E5%B0%86%E6%AF%8F%E4%B8%89%E5%A4%A9%E7%9A%84%E6%96%87%E4%BB%B6%E7%A7%BB%E5%8A%A8%E5%88%B0bash%E4%B8%AD%E7%9A%84%E7%9B%B8%E5%BA%94%E6%96%87%E4%BB%B6%E5%A4%B9.png)
我有几个这样的文件:
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