如何添加格式和批量重命名文件名?

How to add formatting to, and batch rename filenames?

我有大约 7,000 个 .txt 文件是被一个明显违反命名约定的程序吐出的。唯一的优点是它们遵循以下结构:id、date、time。

m031060209104704.txt --> id:m031 日期:060209 时间:104704.txt

其他文件名示例(同样是一样的):

115-060202105710.txt --> id:115- 日期:060202 时间:105710.txt

x138051203125338.txt 等...

9756060201194530.txt 等..

我想重命名此目录中的所有 7,000 个文件,如下所示:

m031060209104704.txt --> 090206_104704_m031.txt

即date_time_id(每个都用下划线或连字符分隔,我不介意)。 不过,我需要将日期格式从 yymmdd 切换为 ddmmyy,如上所示!

我不清楚这里有什么矫枉过正,完整的程序脚本或 bash 命令 (MAC OS)。再说一遍,我不介意,我们将不胜感激。

试试这样的东西:

#!/bin/bash

# directory to store renamed files
newdir="./renamed"
mkdir -p $newdir

for file in *.txt; do
    if [[ $file =~ ^(....)([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{6})\.txt$ ]]; then
        # extract parameters
        id=${BASH_REMATCH[1]}
        yy=${BASH_REMATCH[2]}
        mm=${BASH_REMATCH[3]}
        dd=${BASH_REMATCH[4]}
        time=${BASH_REMATCH[5]}

        # then rearrange them to new name
        newname=${dd}${mm}${yy}_${time}_${id}.txt

        # move to new directory
        mv "$file" "$newdir/$newname"
    fi
done

Bash 字符串索引使您可以轻松高效地按照您的意愿修改文件名。您还应该验证您只对 20 个字符的输入文件名进行操作。这可以通过以下方式完成:

#!/bin/bash

for i in *.txt; do
    ## validate a 20 character filename
    (( ${#i} == 20 )) || { printf "invalid length '%s'\n" "$i"; continue; }
    echo "mv $i ${i:8:2}${i:6:2}${i:4:2}_${i:10:6}_${i:0:4}.txt" ## output rename
    mv "$i" "${i:8:2}${i:6:2}${i:4:2}_${i:10:6}_${i:0:4}.txt"    ## actual rename
done

示例目录

$ ls -l
total 0
-rw-r--r--  1 david david    0 Dec 21 19:16 115-060202105710.txt
-rw-r--r--  1 david david    0 Dec 21 19:16 9756060201194530.txt
-rw-r--r--  1 david david    0 Dec 21 19:15 m031060209104704.txt
-rw-r--r--  1 david david    0 Dec 21 19:16 x138051203125338.txt

例子Use/Output

$ cd thedir
$ bash ../script.sh
mv 115-060202105710.txt 020206_105710_115-.txt
mv 9756060201194530.txt 010206_194530_9756.txt
mv m031060209104704.txt 090206_104704_m031.txt
mv x138051203125338.txt 031205_125338_x138.txt

$ ls -l
total 0
-rw-r--r-- 1 david david 0 Dec 21 19:42 010206_194530_9756.txt
-rw-r--r-- 1 david david 0 Dec 21 19:42 020206_105710_115-.txt
-rw-r--r-- 1 david david 0 Dec 21 19:42 031205_125338_x138.txt
-rw-r--r-- 1 david david 0 Dec 21 19:42 090206_104704_m031.txt

检查一下,如果您有任何其他问题,请告诉我。