操作系统:Fedora
将某目录下面所有的文件名后面加上所有者的名字,比如 a.txt 的所有者为 owner ,修改后为 a[owner].txt 文件。
基本要求:
(1)使用方法:usage:程序名称 目录名称。若没有 “目录名称” 参数,则修改当前目录下文件名称
(2)对目录中的子目录不做变化
(3)给出实验结果
选作要求:
(1)对目录中的子目录也执行同样功能,也就是说递归执行
(2)将修改后的文件的名称复原,即将 a[owner].txt 文件名称改为 a.txt
本文为作者班级作业,同班同学参考借鉴的话,别直接拿本文的截图交差啊 : )
利用 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 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]
执行 ./adduser.sh 文件目录
子目录下文件没变
执行 ./adduser.sh 文件目录 1
子目录下文件改变,由于 app 目录下的文件被执行了两次,所以有两个 [user]
执行 ./readd.sh 文件目录
子目录下文件没变,第一次执行 app 下文件的文件名去掉一个 [user],第二次执行再去掉一个 [user]
执行 ./readd.sh 文件目录 1
子目录下文件改变,由于 app 目录下的文件没有 [user] ,所以不变
执行 ./adduser.sh
修改当前目录下文件名称,子目录下文件没变
执行 ./readd[huazi].sh
改回当前目录下文件名称,子目录下文件不变(多加一个 [huazi] ,是因为 readd.sh 的文件名刚刚被改变了)
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=`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 无法切换回来
本文实例讲述了JS实现的网页倒计时数字时钟效果。分享给大家供大家参考。具体实...
复制代码 代码如下: Function closeHTML(strContent) Dim arrTags, i, OpenPos, ...
外媒 Windows Latest 报道,如果你仍在运行 Windows 10 版本 1909、版本 1903 或...
Hello,大家好,我是麦洛,今天带大家来了解一下SpringBoot如何继承Sentinel来实现...
以下为PHP语言调用去水印接口的示例,分别展示GET请求方式和POST请求方式的调用...
原理 Linux内核发送崩溃时,kdump会生成一个内核转储文件vmcore。 可以通过分析v...
什么是 Cloudbase Toolkit Tencent CloudBase Toolkit 是云开发的 VS Code(Visu...
MySql 整体结构 MySQL 由连接池、SQL 接口、解析器、优化器、缓存、存储引擎等组...
创建数据库连接文件【 dsn 文件】的方法 创建 ODBC DSN 文件 在创建数据库脚本之...
SQL 语句执行慢的原因是面试中经常会被问到的,对于服务端开发来说也是必须要关...