在 Linux 上更改文件名

在 Linux 上更改文件名

我有很多文件名如下的数据:

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

相关内容