1.这段shell可以实现查看当前目录下有多少个文件夹,有多少个文件,其中可读、可写、可执行的分别是多少个。
#!/bin/bash
dir=`ls -l | grep ^d | wc -l`
file=`ls -l | grep ^- | wc -l`
filew=`ls -l | grep w | wc -l`
filer=`ls -l | grep r | wc -l`
filex1=`ls -lF | grep "\*" | wc -l`
filex2=`ls -l | grep ^- |awk 'substr($1,4,1)=="x" || substr($1,4,1)=="s"'|wc -l`
echo "There are $dir directoty in `pwd`."
echo "There are $file files in `pwd`."
echo "There are $filew files are writeabled."
echo "There are $filer files are readabled."
echo "There are $filex1 files can be excuted."
echo "There are $filex2 files can be excuted."
echo "$0"
其中查找当前目录下的可执行文件的命令有两个变量filex1和filex2。
用filex1时有缺陷,如果有文件名是 *结尾的,可能出现问题。(另外使用ls -F命令时,如果文件是目录,在文件名后面放置一个 /,如果文件可执行,则放置一个 *,如果文件为套接字,则放置一个 =,如果为 FIFO,则放置一个 |符号,如果是符号链接,则放置一个 @,所以使用这条命令式,文件结尾有符号*。)
用下面这条命令没有问题
ls -l | grep ^- | awk 'substr($1,4,1)=="x"||substr($1,4,1)=="s" {print $NF}'
-rwxrwxr--. 1 478 Jan 26 12:30 count.sh
查找可读、可写文件时可以直接用grep w或者grep r,但用grep x查找可执行文件时,和ls -l的结果是一样的,相当于grep x没有起作用,不明白为什么这样设计。
个人猜测:在Linux系统下,一个文件至少有两部分,文件正文和文件的属性(比如可读、可写)。文件在硬盘存储时,还是以r、w的方式标识文件的可读、可写的属性,而可执行属性的标识不是x,是另外一种方式。也就是说,文件的属性也是以字符串的形式存储在硬盘中,当我们用grep w检索可写的文件时,和代表属性的字符串进行对比,如果发现了w字符,就显示相关文件;而存储在中的每个文件中都有x这个字符,所以用grep x查找可执行文件时,和ls -l的结果一样。
而且,这种查找可读/可写文件时有弊端,比如说当一个文件命名为keduw,文件的权限为可读,不可写,用grep w 查询可写文件时,这个文件也会显示出来,因为它的名字中包含w这个字符。
2.实现同样的功能还有一种写法,如下:
#!/bin/bash
f=0
d=0
x=0
for files in *
do
if [ -f "$files" ]
then
f=`expr $f + 1`
if [ -x "$files" ]
then
x=`expr $x + 1`
fi
fi
done
for directory in *
do
if [ -d "$directory" ]
then d=`expr $d + 1`
fi
done
echo "There are $d directorys in `pwd`."
echo "There are $f files in `pwd`,and $x of them can be excuted."
注意是否要添加空格,if [ -f "$files" ]之间要加空格,赋值之间不能加空格,f=0.还有可写的文件一定要有可读的属性,不然无法编辑。
要判断是否可读/可写,只需要再添加两个if语句即可。