我有很多文件名如下的数据:
20110.bil
20111.bil
20112.bil
...
2011150.bil
2011151.bil
2011152.bil
上述文件名的格式为:
year+(0-152)
0-152 表示 8 月 1 日至 12 月 31 日。
我想将该文件名更改为
20110801.bil
20110802.bil
20110803.bil
............
............
20111229.bil
20111230.bil
20111231.bil
我想要的文件名的模式是:
year+month+day.
我该如何解决我的问题?
答案1
这个 Bash 解决方案怎么样?
#!/bin/bash
shopt -s nullglob extglob
for file in +([[:digit:]]).bil; do
file_noext=${file%.bil}
year=${file_noext::4}
day=${file_noext:4}
[[ -z $day ]] || ((0<=day && day<=152 && ${#year}==4)) || { echo "Error with file $file"; continue; }
newname=$(date -d "$year-08-01 + $day days" '+%Y%m%d.bil')
echo mv -nv "$file" "$newname"
done
- 这将循环所有形式为数字(仅由数字组成)的
X.bil
文件X
。 - 对于每个文件,去掉扩展名后
.bil
,我们提取前四个字符( ),并在变量year
中得到剩余的数字。day
- 然后有一行检查一切是否正常(
day
非空,介于 0 到 152 之间,并且year
确实有 4 个字符)。 - 之后我们使用该
date
实用程序(希望你有一个date
像我一样聪明的程序,可以对日期进行算术运算,在这里将天数添加到给定的日期)。 - 最后我们执行重命名(好吧,我
echo
在 前面留了一个mv
,这样只显示命令而不执行;echo
如果您满意的话,可以删除 )。
测试。我调用了这个脚本banana
(删除了echo
)然后我chmod +x banana
。然后:
$ mkdir scratch
$ cd scratch
$ touch 2011{0,42,100,151}.bil
$ ls
20110.bil 2011100.bil 2011151.bil 201142.bil
$ ./banana
`20110.bil' -> `20110801.bil'
`2011100.bil' -> `20111109.bil'
`2011151.bil' -> `20111230.bil'
`201142.bil' -> `20110912.bil'
$ ls
20110801.bil 20110912.bil 20111109.bil 20111230.bil
看起来不错!
答案2
以下脚本将为您完成此操作:
#!/bin/bash
> out.txt
while read line; do
mytmp=$(echo $line | sed 's/.bil$//' | sed 's/^2011//' )
echo $mytmp
if [ $mytmp -lt 31 ]; then
MONTH=08
DAY=$(( $mytmp + 1))
elif [ $mytmp -lt 61 ]; then
MONTH=09
DAY=$(( $mytmp - 30 ))
elif [ $mytmp -lt 92 ]; then
MONTH=10
DAY=$(( $mytmp - 60 ))
elif [ $mytmp -lt 122 ]; then
MONTH=11
DAY=$(( $mytmp - 91 ))
elif [ $mytmp -lt 153 ]; then
MONTH=12
DAY=$(( $mytmp -121 ))
fi
echo "2011$MONTH$DAY.bil" >> out.txt
done < data
它的工作原理如下:它读取一个名为数据逐行输出,并将其输出放入名为输出文件(根据你的需要进行更改)。第一行清除输出文件,然后读取数据文件,删除初始2011最后.bil剩下的就是日编码。然后,根据日编码,确定相应的月份和日期,并通过前置2011,附加.bil,并将最终的字符串放入文件中输出.txt。