Linux 是很多人走进计算机行业的敲门砖,同时也是面试官最喜欢问的知识点。但 Linux 中的命令较多,且单个命令的参数和格式又眼花缭乱,真正掌握还是有很大难度的。
本场 Chat,就是帮你梳理面试官最常考察的命令,配合操作示例,让你手把手体验,理解更到位。
1. find 命令
1.1 find -regex 与 find -name 的区别
若一个目录中,有如下目录:
susu@ubuntu:~/find_test$ ls
aaa aaa 22 1
susu@ubuntu:~/find_test$
可以使用 -name 进行名字匹配查询:
susu@ubuntu:~/find_test$ find . -name "a*"
./aaa
./aa
susu@ubuntu:~/find_test$
若同样的方式,使用 -regex 查询,则不能得到想要的结果:
susu@ubuntu:~/find_test$ find . -regex "a*"
susu@ubuntu:~/find_test$
出现以上结果的原因在于 -name 只要求匹配当前目录中的文件(夹)名称,而 -regex 则是把 find 输出的完整结果作为匹配对象,所以上面的命令中,默认是以 a 作为开头的字符串匹配,是不符合 -regex 规则,所以没能匹配到想要的结果。
正确用法如下:
susu@ubuntu:~/find_test$ find . -regex ".*a+"
./aaa
./aa
susu@ubuntu:~/find_test$
注意:
根据正则表达式的语法,应该加上 .* 而不是 *,具体正则表达式语法,参见链接http://www.runoob.com/regexp/regexp-syntax.html。
命令选项之后的参数,可用双引号包裹起来,也可以不用。
在 -name 语法中,可以使用星号 *,在知道部分文件名的情况下使用。但是正则表达式语法中的其他特殊字符是没有效果的,而且两种方式下的星号含义也不同。比如如下的操作,是找不到文件夹“cccccc”的。
susu@ubuntu:~/find_test$ ls
1 aa cccccc mycprogram.c Program.c
2 aaa mybashprogram.sh MyCProgram.c
susu@ubuntu:~/find_test$ find . -name "c*"
./cccccc
susu@ubuntu:~/find_test$ find . -name "c.*"
susu@ubuntu:~/find_test$
例子:eclipse 工程文件夹下有 4 个 project
susu@ubuntu:~/workspace$ ls
RemoteSystemsTempFiles test_new_web_maven
testJust test_quickstart_maven
susu@ubuntu:~/workspace$ cd ..
susu@ubuntu:~$
退回到上一层之后,用 -regex 查找 workspace 文件夹下的内容,使用如下语句:
susu@ubuntu:~$ find ./workspace/ -regex ".*test_new.*"
./workspace/.metadata/.plugins/org.eclipse.core.resources/.projects/test_new_web_maven
./workspace/.metadata/.plugins/org.eclipse.core.resources/.projects/test_new_web_maven/org.eclipse.jdt.core
./workspace/.metadata/.plugins/org.eclipse.core.resources/.projects/test_new_web_maven/org.eclipse.jdt.core/state.dat
./workspace/.metadata/.plugins/org.eclipse.core.resources/.projects/test_new_web_maven/.markers
./workspace/test_new_web_maven
./workspace/test_new_web_maven/src
./workspace/test_new_web_maven/src/main
./workspace/test_new_web_maven/src/main/webapp
./workspace/test_new_web_maven/src/main/webapp/index.jsp
./workspace/test_new_web_maven/src/main/webapp/WEB-INF
./workspace/test_new_web_maven/src/main/webapp/WEB-INF/web.xml
./workspace/test_new_web_maven/src/main/resources
./workspace/test_new_web_maven/.classpath
./workspace/test_new_web_maven/.project
./workspace/test_new_web_maven/target
./workspace/test_new_web_maven/target/classes
./workspace/test_new_web_maven/pom.xml
susu@ubuntu:~$
1.2 Linux 命令中的“permission denied问题
普通用户在根目录中使用 find 命令时,通常会碰到类似以下的问题:
susu@ubuntu:/$ find / -name *.txt
...
find: `./.gvfs': Permission denied
find: `./.dbus': Permission denied
find: `./.cache/dconf': Permission denied
因为管理员用户 root 设置了某些文件夹“禁止”普通用户访问,所以普通用户在使用以上命令时会出现如下错误。
解决方案:先给出链接,一个百度文库,搜索关键字就可以看到解决方法。
/dev/null 称为 Linux 黑洞,等价于一个只写文件,所有写入它的内容都会消失,既然会消失,那么该文件也是打不开的,也无法从该文件当中读取任何内容。而解决的途径就是把含有 permission denied 的报错信息都输入该文件即可。
对于可能存在该报错信息的命令(在根目录 / 下执行 find 命令,通常都会有此报错),那么可以该 find 命令后,添加一句话,比如上面的 find 命令:
susu@ubuntu:/$ find / -name *.txt 2>/dev/null
在后面加上命令 2>/dev/null 就避免了报错问题。
1.3 find 命令忽略大小写
只需要在命令选项前加一个 i,就可忽略大小写。-name 换为 -iname,-regex 换为 -iregex。
1.4 和文件访问、修改以及对应时间相关的 find 命令
主要是 -mtime 和 -ctime 命令选项:
-amin n 查找系统中最后N分钟访问的文件
-atime n 查找系统中最后n*24小时访问的文件
-cmin n 查找系统中最后N分钟被改变文件状态的文件
-ctime n 查找系统中最后n*24小时被改变文件状态的文件
-mmin n 查找系统中最后N分钟被改变文件数据的文件
-mtime n 查找系统中最后n*24小时被改变文件数据的文件
从上面的解释看出,文件被改变,分为两类,一类是文件状态的改变,比如权限、归属关系,这个时候的前缀是 -c...(比如:-cmin n、-ctime n);一类是文件数据的改变,就是修改的文件内容,前缀是 -m...(-mmin n、-mtime n)。
后面的 n,有两种,一种是 +n,一种是
隐藏内容