如何添加格式和批量重命名文件名?
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
检查一下,如果您有任何其他问题,请告诉我。
我有大约 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
检查一下,如果您有任何其他问题,请告诉我。