跳到主要内容

一条命令搞定

1.批量修改文件名

1.1 增加内容

有多个sh文件,现在用一条命令做以下修改

# 修改前
1.sh 2.sh 3.sh

# 修改后
1_hehe.sh 2_hehe.sh 3_hehe.sh

使用sed分组功能

ls *.sh|sed -nr 's#((.*)\.sh)#mv \1 \2_hehe.sh#gp' | bash

将命令拆解一下

# sed替换中最外边的括号是匹配整个文件名的,即上边命令中的 \1
$ ls *.sh|sed -r 's#((.*)\.sh)#\1#g'
1.sh
2.sh
3.sh

# 里边的括号是匹配文件名中的数字,即上边命令中的 \2
$ ls *.sh|sed -r 's#((.*)\.sh)#\2#g'
1
2
3

# 有了分组,再配合mv命令拼接
$ ls *.sh|sed -nr 's#((.*)\.sh)#mv \1 \2_hehe.sh#gp'
mv 1.sh 1_hehe.sh
mv 2.sh 2_hehe.sh
mv 3.sh 3_hehe.sh

# 最后通过管道执行bash使命令生效
$ ls *.sh|sed -nr 's#((.*)\.sh)#mv \1 \2_hehe.sh#gp' | bash
$ ls
1_hehe.sh 2_hehe.sh 3_hehe.sh

1.2 删除内容

有多个sh文件,现在用一条命令做以下修改

# 修改前
abc_html_01.jpg abc_html_02.jpg abc_html_03.jpg

# 修改后
abc_01.jpg abc_02.jpg abc_03.jpg

方法一:使用sed分组功能

ls *.jpg | sed -r 's#(.*_)(.*_)(.*)#mv \1\2\3 \1\3#g' |bash

将命令拆解一下

# 根据文件内容匹配成3组,第1组匹配的内容
$ ls *.jpg | sed -r 's#(.*_)(.*_)(.*)#\1#g'
abc_
abc_
abc_

# 根据文件内容匹配成3组,第2组匹配的内容
$ ls *.jpg | sed -r 's#(.*_)(.*_)(.*)#\2#g'
html_
html_
html_

# 根据文件内容匹配成3组,第3组匹配的内容
$ ls *.jpg | sed -r 's#(.*_)(.*_)(.*)#\3#g'
01.jpg
02.jpg
03.jpg

# 有了分组,再配合mv命令拼接
$ ls *.jpg | sed -r 's#(.*_)(.*_)(.*)#mv \1\2\3 \1\3#g'
mv abc_html_01.jpg abc_01.jpg
mv abc_html_02.jpg abc_02.jpg
mv abc_html_03.jpg abc_03.jpg

# 最后通过管道执行bash使命令生效
$ ls *.jpg | sed -r 's#(.*_)(.*_)(.*)#mv \1\2\3 \1\3#g' | bash
$ ls
abc_01.jpg abc_02.jpg abc_03.jpg

方法二:for循环

for i in `ls ./*`;do mv $i $(echo $i|sed 's#html_##g');done

重命名格式: mv 源文件 目标文件

分以下3步拼接

  • 第一步:形成源文件,abc_html_01.jpg ,将文件放入变量中,for i in ls *.jpg ,这时变量 i 中的值就是这3个文件了
  • 第二步:形成目标文件,显示变量中的内容并且利用sed替换,echo $i|sed 's#html_##g',这时目标文件就变为了 abc_01.jpg
  • 第三步:利用mv命令修改,$i 是源文件,echo $i|sed -r 's#html_##g' 就是目标文件,mv $i $(echo $I | sed 's#html_##g')
$ for i in `ls ./*`;do mv $i $(echo $i|sed 's#html_##g');done
$ ls
abc_01.jpg abc_02.jpg abc_03.jpg

方法三:rename命令

rename 命令语法格式: rename 要替换的内容 要替换为什么 要替换的文件

$ rename html_ "" *.jpg
$ ls
abc_01.jpg abc_02.jpg abc_03.jpg