Shell支持大量对文件属性的判断,常用的文件属性操作符很多,如下表所示。更多文件属性操作符可以参考命令帮助手册(man test)。

可以创建新的文件,也可以使用已有的文件进行测试。
判断文件是否存在:
- root@ubuntu:/home/csdn# [ -e main.c ] && echo Y || echo N
- Y
- root@ubuntu:/home/csdn# [ -e nofile.c ] && echo Y || echo N
- N
- root@ubuntu:/home/csdn# [ ! -e nofile.c ] && echo Y || echo N
- Y
- root@ubuntu:/home/csdn# [ ! -e main.c ] && echo Y || echo N
- N
- root@ubuntu:/home/csdn#
目录判断:hello是一个目录
-
- root@ubuntu:/home/csdn# [ -e hello ] && echo Y || echo N
- Y
- root@ubuntu:/home/csdn# [ -f hello ] && echo Y || echo N
- N
- root@ubuntu:/home/csdn# [ -d hello ] && echo Y || echo N
- Y
- root@ubuntu:/home/csdn#
下面这个测试,假设系统中有某个磁盘设备,使用-b测试该设备是否存在,且当该设备为块设备时返回值为Y,否则返回值为N。
- root@host:~# [ -b /dev/mmcblk1p2 ] && echo Y || echo N
- Y
- root@host:~# [ -b /dev/mmcblk1p1 ] && echo Y || echo N
- Y
- root@host:~# [ -b /dev/mmcblk1p3 ] && echo Y || echo N
- N
- root@host:~#
Linux系统中的文件链接分为软链接和硬链接两种。软链接创建后,如果源文件被删除,则软链接将无法继续使用,可以跨分区和磁盘创建软链接。硬链接创建后,如果源文件被删除,则硬链接依然可以正常使用、正常读写数据,但硬链接不可以跨分区或磁盘创建。另外,硬链接与源文件使用的是相同的设备、相同的inode编号。使用ls -l(小写字母L)命令查看硬链接文件的属性时,文件属性与普通文件是一样的,而软链接的文件属性则可以看到被l(小写字母L)标记,表示该文件为软链接。
虽然文件main.c不存在,但是依然可以创建一个指向它的软链接
- root@host:~# ln -s main.c softlink.c
- root@host:~# ls -l main.c softlink.c
- ls: main.c: No such file or directory
- lrwxrwxrwx 1 root root 6 Jan 1 05:55 softlink.c -> main.c
- root@host:~#
此时指向的main.c是红色的

使用touch创建了一个main.c,链接颜色正常了

判断软链接:
- root@host:~# [ -L softlink.c ] && echo Y || echo N
- Y
- root@host:~#
硬链接判断:
- root@host:~# ln main.c hard.c
- root@host:~# [ -f hard.c ] && echo Y || echo N
- Y
- root@host:~# [ -L hard.c ] && echo Y || echo N
- N
- root@host:~#
在测试权限时需要注意,超级管理员root在没有rw权限的情况下,也是可以读写文件的,rw权限对超级管理员是无效的。但是如果文件没有x权限,哪怕是root也不可以执行该文件。
- root@host:~# ls -l main.c
- -rw-rw-rw- 2 root root 0 Jan 1 05:58 main.c
- root@host:~# chmod -rw main.c
- root@host:~# ls -ls main.c
- 1 ---------- 2 root root 6 Jan 1 06:06 main.c
- root@host:~# echo "hello" > main.c
- root@host:~# cat main.c
- hello
- root@host:~# ./main.c
- -sh: ./main.c: Permission denied
- root@host:~#
-
为了获得相对可参考的值,切换用户为普通用户:
测试之前,文件main.c可读可写,通过chmod -rw后,文件不可读,不可写。
- csdn@ubuntu:~$ ls -ls main.c
- 4 -rw-rw-r-- 1 csdn csdn 93 11月 26 11:04 main.c
- csdn@ubuntu:~$ [ -r main.c ] && echo Y || echo N
- Y
- csdn@ubuntu:~$ [ -w main.c ] && echo Y || echo N
- Y
- csdn@ubuntu:~$ [ -x main.c ] && echo Y || echo N
- N
- csdn@ubuntu:~$ chmod -rw main.c
- csdn@ubuntu:~$ [ -r main.c ] && echo Y || echo N
- N
- csdn@ubuntu:~$ [ -w main.c ] && echo Y || echo N
- N
- csdn@ubuntu:~$ [ -x main.c ] && echo Y || echo N
- N
- csdn@ubuntu:~$
默认touch命令创建的文件都是空文件,在使用-s测试文件是否为非空文件时,因为文件是空文件,所以测试结果为假。当文件中有内容时,测试文件是否为非空时,结果为真。
- root@host:~# [ -s newfile ] && echo Y || echo N
- N
- root@host:~# echo "hehe" > newfile
- root@host:~# ls -ls newfile
- 1 -rw-rw-rw- 1 root root 5 Jan 1 06:09 newfile
- root@host:~# [ -s newfile ] && echo Y || echo N
- Y
- root@host:~#
现在可以使用测试条件判断两个文件的创建时间,看看哪个文件是新文件,哪个文件是旧文件。new than表示更新,old than表示更旧。根据下面的输出结果可知,main.c文件比other.c文件更旧。
首先,看下两个文件的信息:
- csdn@ubuntu:~$ ls main.c other.c -ls
- 4 ---------- 1 csdn csdn 93 11月 26 11:04 main.c
- 4 -rw-rw-r-- 1 csdn csdn 89 11月 26 11:10 other.c
- csdn@ubuntu:~$
文件main.c比other.c更旧
- csdn@ubuntu:~$ [ main.c -nt other.c ] && echo Y || echo N
- N
- csdn@ubuntu:~$ [ main.c -ot other.c ] && echo Y || echo N
- Y
- csdn@ubuntu:~$
文件main.c自己和自己比呢?既不新也不旧。
- csdn@ubuntu:~$ [ main.c -ot main.c ] && echo Y || echo N
- N
- csdn@ubuntu:~$ [ main.c -nt main.c ] && echo Y || echo N
- N
- csdn@ubuntu:~$