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 |