bash批量修改文件名,关联 timestamp, script, filename, batch

使用sed匹配正则表达式,来批量修改文件名

1
2
3
4
5
6
7
8
9
10
$ for f in * ; do [ -f "$f" ] && echo "$f"; done
第091集 孙悟空再训猪八戒大战二魔头.mp3
第092集 三魔施毒计,唐僧再困狮驼国.mp3

# 使用 sed 去掉文件开头的 第
$ for f in * ; do [ -f "$f" ] && nf=$(echo "$f" | sed 's/第\(.*\)/\1/') && mv "$f" "$nf"  ; done

$ ls -1
'091集 孙悟空再训猪八戒大战二魔头.mp3'
'092集 三魔施毒计,唐僧再困狮驼国.mp3'

实例: 将文件开头的方括号删除

1
for f in \[* ; do [ -f "$f" ] && nf=$(echo "$f" | sed 's/\[\(.*\)/\1/') && mv "$f" "$nf"  ; done

例如,原来

1
2
$ ls
'[01.txt'  '[02.txt'  '[03.txt'   04.txt

执行后 文件名中开头的[ 都被删除了 :

1
2
$ ls
'01.txt'  '02.txt'  '03.txt'   04.txt

给文件名编号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ for f in $(ls -1 | grep 高); do [ -f "$f" ] && echo "$f"; done
10.1长高游戏大作战(上).mp3
10-1长高游戏大作战上:人为什么会长高.mp3
11.1长高游戏大作战(下).mp3
11-2科学知识卡:世界上最高的人.mp3
11.2科学知识卡:世界上最高的人.mp3
12-3人体小课堂:关于长高.mp3

# 看下效果

$ CNT=0; for f in $(ls -1 | grep 高); do [ -f "$f" ] && CNT=$((CNT+1)) && PRE=$(printf "%03d" $CNT) && echo "$PRE"".""$f"; done
001.10.1长高游戏大作战(上).mp3
002.10-1长高游戏大作战上:人为什么会长高.mp3
003.11.1长高游戏大作战(下).mp3
004.11-2科学知识卡:世界上最高的人.mp3
005.11.2科学知识卡:世界上最高的人.mp3
006.12-3人体小课堂:关于长高.mp3

# 实际修改,注意! 文件名有空格,这个方法会出错!!
CNT=2; for f in $(ls -1 | grep 高); do [ -f "$f" ] && CNT=$((CNT+1)) && PRE=$(printf "%03d" $CNT) && mv -- "$f" "$PRE"".""$f"; done

# 使用 find + while loop 解决文件名包含空格的问题
CNT=5; find * -type f | while read file; do CNT=$((CNT+1)) && PRE=$(printf "%03d" $CNT) && mv -- "$file" "$PRE"".""$file"; done

使用修改时间批量重命名文件

1
2
3
4
5
for f in * ; do [ -f "$f" ] && echo "VIDEO_"$(date -r "$f" +%Y%m%d_%H%M%S)"."$(echo "$f" | awk -F . '{if (NF>1) {print $NF}}'); done

for f in * ; do [ -f "$f" ] && mv -- "$f" "VIDEO_"$(date -r "$f" +%Y%m%d_%H%M%S)"."$(echo "$f" | awk -F . '{if (NF>1) {print $NF}}'); done

for f in * ; do [ -f "$f" ] && mv -- "$f" "IMG_"$(date -r "$f" +%Y%m%d_%H%M%S)"."$(echo "$f" | awk -F . '{if (NF>1) {print $NF}}'); done
  • 文件名加前缀
1
2
for f in * ; do [ -f "$f" ] && echo "我是前缀_""$f"; done
for f in * ; do [ -f "$f" ] && mv -- "$f" "我是前缀_""$f"; done

把文件批量移动到上一级目录

1
for f in $(find . -type f) ; do [ -f "$f" ] && nf=$(echo "$f" | sed 's/\.\/\(.*\)/\1/' | sed 's/\(.*\)\/\(.*\)/\1\-\2/') && mv "$f" ../"$nf"; done
  • 开始:
1
2
3
4
5
6
├── 21-01-01-01-01
│   └── QQ截图20220928093845.png
├── 21-01-01-02-01
│   └── QQ截图20220928093936.png
├── 21-01-01-03-01
│   └── QQ截图20220928094110.png
  • 整理完:
1
2
3
├── 21-01-01-01-01-QQ截图20220928093845.png
├── 21-01-01-02-01-QQ截图20220928093936.png
└── 21-01-01-03-01-QQ截图20220928094110.png