一条命令搞定
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