我有大约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
示例使用/输出
$ 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
仔细看看,如果您有任何其他问题,请告诉我。