• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

Linux编程基础之shell脚本修改文件名

互联网 diligentman 2周前 (04-07) 5次浏览

目录

  • 前言
  • 代码
    • 编写 adduser.sh 文件
    • 编写 readd.sh文件
  • 执行结果
  • 代码讲解
    • 传参
    • 对 a,b,c 的解释
    • 递归部分

前言

操作系统:Fedora
将某目录下面所有的文件名后面加上所有者的名字,比如 a.txt 的所有者为 owner ,修改后为 a[owner].txt 文件。
基本要求:
(1)使用方法:usage:程序名称 目录名称。若没有 “目录名称” 参数,则修改当前目录下文件名称
(2)对目录中的子目录不做变化
(3)给出实验结果
选作要求:
(1)对目录中的子目录也执行同样功能,也就是说递归执行
(2)将修改后的文件的名称复原,即将 a[owner].txt 文件名称改为 a.txt

本文为作者班级作业,同班同学参考借鉴的话,别直接拿本文的截图交差啊 : )


代码

编写 adduser.sh 文件

利用 VI 编辑器编辑如下的 shell 程序,并保存名称为 adduser.sh 文件
调用命令为

./adduser.sh           #当前目录下文件名称
./adduser.sh Desktop   #当前目录下的Desktop目录下文件名称
./adduser.sh Desktop 1 #当前目录下的Desktop目录及其子目录下文件名称(包括子目录的子目录)(0:则不修改子目录)

adduser.sh 文件内容

#!/bin/bash
function adduser()
{
test $2 -ne 2 && cd $1
for eachfile in `ls`
do
        a=`expr "$eachfile" : '.*..*'`  #对于没有后缀的文件,a=0
        b=`expr "$eachfile" : '.*'`      #文件名(包括后缀)的长度

        if [ $a -eq $b ];then            #如果有后缀
                filename=${eachfile%%.*}  #文件名
                suffix=${eachfile#*.}     #后缀
                user="huazi"
                mv $filename.$suffix $filename[$user].$suffix
        else
                filename=${eachfile%.*}   #文件名
                user="huazi"
                mv $filename $filename[$user]

                if [ $2 -eq 1 ];then
                        if [ -d $filename[$user] ];then
                                local nowfile=`pwd`
                                adduser $filename[$user] 1
                                cd $nowfile
                        fi
                fi
        fi
done
}
if [ $# -eq 0 ];then
        adduser 0 2
elif [ $# -eq 1 ];then
        adduser $1 0
elif [ $# -eq 2 ];then
        adduser $1 $2
else
        echo "usage:./adduser or ./adduser p1 p2"
        exit 1
fi

编写 readd.sh文件

调用命令为

./readd.sh           #当前目录下文件名称
./readd.sh Desktop   #当前目录下的Desktop目录下文件名称
./readd.sh Desktop 1 #当前目录下的Desktop目录及其子目录下文件名称(包括子目录的子目录)(0:则不修改子目录)

readd.sh 文件内容

#!/bin/bash
function readd()
{
test $2 -ne 2 && cd $1
for eachfile in `ls`
do
        a=`expr "$eachfile" : '.*..*'`  #对于没有后缀的文件,a=0
        b=`expr "$eachfile" : '.*'`      #文件名(包括后缀)的长度
        c=`expr "$eachfile" : '.*[.*'`  #对于没有[]的文件,c=0

        if [ $b -eq $c -a $a -eq $b ];then    #如果有后缀和[]
                filename=${eachfile%[*}    #文件名
                suffix=${eachfile#*.}      #后缀
                user="huazi"
                mv $eachfile $filename.$suffix
        elif [ $a -ne $b ];then               #如果没有后缀
                filename=${eachfile%[*]}  #文件名
                user="huazi"

                if [ $b -eq $c ];then         #如果没有后缀,但有[]
                        mv $eachfile $filename
                fi
                
                if [ $2 -eq 1 ];then          #如果这是个文件目录且参数1
                        if [ -d $filename ];then
                                local nowfile=`pwd`
                                readd $filename 1
                                cd $nowfile
                        fi
                fi
        fi
done
}
if [ $# -eq 0 ];then
        readd 0 2
elif [ $# -eq 1 ];then
        readd $1 0
elif [ $# -eq 2 ];then
        readd $1 $2
else
        echo "usage:./readd or ./readd p1 p2"
        exit 1
fi

执行结果

执行前,文件名没带 [user]
Linux编程基础之shell脚本修改文件名
执行 ./adduser.sh 文件目录
子目录下文件没变
Linux编程基础之shell脚本修改文件名
执行 ./adduser.sh 文件目录 1
子目录下文件改变,由于 app 目录下的文件被执行了两次,所以有两个 [user]
Linux编程基础之shell脚本修改文件名
执行 ./readd.sh 文件目录
子目录下文件没变,第一次执行 app 下文件的文件名去掉一个 [user],第二次执行再去掉一个 [user]
Linux编程基础之shell脚本修改文件名
执行 ./readd.sh 文件目录 1
子目录下文件改变,由于 app 目录下的文件没有 [user] ,所以不变
Linux编程基础之shell脚本修改文件名
执行 ./adduser.sh
修改当前目录下文件名称,子目录下文件没变
Linux编程基础之shell脚本修改文件名
执行 ./readd[huazi].sh
改回当前目录下文件名称,子目录下文件不变(多加一个 [huazi] ,是因为 readd.sh 的文件名刚刚被改变了)
Linux编程基础之shell脚本修改文件名

代码讲解

传参

adduser.sh 文件的最后几行

if [ $# -eq 0 ];then
        adduser 0 2
elif [ $# -eq 1 ];then
        adduser $1 0
elif [ $# -eq 2 ];then
        adduser $1 $2
else
        echo "usage:./adduser or ./adduser p1 p2"
        exit 1
fi

结合函数开头的

test $2 -ne 2 && cd $1

这两段代码的功能将四种传参的情况分类处理:
(1)./adduser.sh
不传参,第一个参数默认当前目录,默认不对子目录操作
(2)./adduser.sh Desktop
第一个参数为:当前目录下的Desktop目录,不对子目录操作
(3)./adduser.sh Desktop 1
第一个参数为:当前目录下的Desktop目录,
第一个参数为1:修改子目录(0:则不修改子目录)

对于 readd.sh文件同理

对 a,b,c 的解释

a=`expr "$eachfile" : '.*..*'`  #对于没有后缀的文件,a=0
b=`expr "$eachfile" : '.*'`      #文件名(包括后缀)的长度
c=`expr "$eachfile" : '.*[.*'`  #对于没有[]的文件,c=0

正则表达式内容
注意 `expr 中 expr 左边的符号不是单引号,是键盘上方 数字1 键左边哪个,为命令替换符号,一般成对出现

递归部分

if [ $2 -eq 1 ];then
	if [ -d $filename[$user] ];then
		local nowfile=`pwd`
		adduser $filename[$user] 1
	    cd $nowfile
    fi
fi

注意事项:
(1)递归调用函数后,要用 cd 命令把目录切换回来
(2)不能用 cd – 命令把目录切换回来,因为当递归超过三层时,cd – 会切换成子目录的子目录
(3)nowfile 要声明为局部变量,否则在 递归调用后会被改变,导致 cd $nowfile 无法切换回来


程序员灯塔
转载请注明原文链接:Linux编程基础之shell脚本修改文件名
喜欢 (0)