在使用UNIX和MS-DOS命令行时,已经引入了一些shell元字符,它们用于扩展文件名。其中,星号(*)用于匹配文件名中的所有字符,问号(?)负责匹配文件中的单个字符,而方括号则匹配文件名中某一组字符中的一个。将这些shell元字符扩展为文件名的过程就称作globbing
which 命令
which - locate a command
在 PATH 变量指定的路径中搜索可执行文件的所在位置
Usage:
which 可执行文件名称
补充知识: 到底什么是Shell命令?
Linux系统中所有的可执行文件都可以作为Shell命令来解释执行
命令可以是下面四种形式之一:
- 是一个可执行程序:包括Linux命令,存放在 /bin, /sbin目录下; 还包括实用程序,存放在 /usr/bin, /usr/sbin, /usr/local/bin等目录下; 还包括经过编译生成的二进制文件,用C、C++语言写的程序
- 是一个内建于 shell 自身的命令:bash 支持若干命令,内部叫做 shell 内部命令 (builtins)
- 是一个 shell 函数:这些是小规模的 shell 脚本,它们混合到环境变量中
- 是一个命令别名:我们可以定义自己的命令,建立在其它命令之上
whereis 命令
whereis 命令主要用于定位可执行文件、源代码文件、帮助文件在文件系统中的位置。whereis 命令还具有搜索源代码、指定备用搜索路径和搜索不寻常项的能力
whereis 命令查找速度非常快,这是因为它根本不是在磁盘中漫无目的乱找,而是在一个数据库中(/var/lib/mlocate/mlocate.db)查询。这个数据库是 Linux 系统自动创建的,包含有本地所有文件的信息,并且每天通过自动执行 updatedb 命令更新一次。也正是因为这个数据库要每天才更新一次,就会使得 whereis 命令的搜索结果有时候会不准确,比如刚添加的文件可能搜不到
whereis - locate the binary, source, and manual page files for a command
whereis [-bmsu] [-BMS directory… -f] filename
常用参数:
-b 定位可执行文件
-m 定位帮助文件
-s 定位源代码文件
-u 搜索默认路径下除可执行文件、源代码文件、帮助文件以外的其它文件
locate 命令
locate - find files by name
locate 命令跟 whereis 命令类似,且它们使用的是相同的数据库。但 whereis 命令只能搜索可执行文件、联机帮助文件和源代码文件,如果要获得更全面的搜索结果,可以使用 locate 命令。
locate 命令使用了十分复杂的匹配语法,可以使用特殊字元(如’*’和’?’)来指定需要查找的样本。
find 命令
find - search for files in a directory hierarchy
find 命令主要作用是沿着文件层次结构向下遍历,匹配符合条件的文件,并执行相应的操作。
Linux 下 find 命令提供了相当多的查找条件,功能很强大,对应的学习难度也比较大
命令格式:
find 【选项】 【搜索路径】 【表达式】
默认路径是当前目录,默认表达式为-print。
表达式可能由下列成份组成:操作符、选项、测试表达式以及动作。
常用参数:
-print find 命令将匹配的文件输出到标准输出
-exec command {} \; find 命令对匹配的文件执行**该参数所给出的 shell 命令**,即command操作,{}是占位符,\;是结束符,但是分号要转义
-ok 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行
-name 按照文件名查找文件,-iname 选项跟-name 选项作用一样,不同在于-iname 会忽略字母大小写
-type b/d/c/p/l/f 查找某一类型的文件
-size n[c] 查长度为n块[或n字节]的文件
-depth 使查找在进入子目录前先行查找完本目录
-prune 忽略某个目录,使用这一选项可以使 find 命令不在当前指定的目录中查找,如果同时使用-depth 选项,那么-prune 将被 find 命令忽略
-inum 根据 i节点查找
-user username 按照文件所有者来查找文件
-group groupname 按照文件所属组来查找文件
-perm 按执行权限来查找
-mtime [-n | +n] 按照文件的更改时间来查找文件,-n指n天以内,+n指n天以前
-atime [-n | +n] 按文件访问时间来查找,-n指n天以内,+n指n天以前
-ctime [-n | +n] 按文件创建时间来查找文件,-n指n天以内,+n指n天以前
-amin [-n | +n] 访问时间 access -n指n分钟以内,+n指n分钟以前
-cmin [-n | +n] 文件属性 change -n指n分钟以内,+n指n分钟以前
-mmin [-n | +n] 文件内容 modify -n指n分钟以内,+n指n分钟以前
For example:
find . -print 打印当前目录下所有文件的目录列表
find . -name "*.txt" -print 打印当前目录下所有以.txt 结尾的文件名
find ~ \(-name "*.pdf" or -name "*.txt"\) 打印主目录下所有**以.txt 或.pdf 结尾**的文件名
find . -type l -name "*.txt" 以.txt 结尾的符号链接
find . -type f -name "*.php" -perm 777 所有权限为 777 的 php 文件
find . -type f -user root 当前目录下 root 用户拥有的所有文件
find . -type f \( ! -perm 777 -and ! -perm 644 \) 当前目录下权限不是 777 和 664 的所有文件
find /etc -cmin -5 在/etc下查找5分钟内被修改过属性的文件和目录
find / -size +204800 在根目录下查找大于100MB的文件
注意:默认单位是b,而它代表的是512字节,所以2表示1K,1M则是2048,如果不想自己转换,可以使用其他单位,如c、K、M等。
查找当前目录下文件大小为2048(2k)字节的文件
find . -size 4
find . -size 2048c
find . -size 2K
find / -size +10M -a -size -20M 在根目录下查找大于10M小于20M的文件
find /etc -perm 777 -exec ls -l {} \; 在/ect目录下查找权限为777的文件,并显示其详细信息
find /work -name "*.c" -exec cat {} \; > all_c_file 先查找到所有的 c 语言代码文件,然后将这些文件内容写入到一个文件中
默认下,-exec 后面只能使用单个命令,如果想要多个命令,可以将多个命令写入脚本文件中,然后在-exec 中使用这个脚本,可以使用如下命令:
find . -name “*.c” -exec sh ./command.sh {} \;
脚本内容:
#! /bin/bash
ls -l $1 # $1表示传进来的第一个参数
cat $1
wc 命令
wc 命令是一个统计的工具,主要用来显示文件所包含的行、字和字节数。
wc 命令是 word count 的缩写
命令格式:
wc [选项] [文件]
常用参数:
-l 统计行数
-w 统计字数,一个字被定义为由空白、跳格或换行字符分隔的字符串
-c 统计字节数
-m 统计字符数,注意中文字符,不能与 -c 标志一起使用
-L 打印最长行的长度
注意每行结尾的换行符也算一个字符,空格也算一个字符。另外,由于系统采用 UTF-8 编码,所以一个汉字为 3 字节,9 个汉字加上一个换行,一共 28 个字节
统计/bin 目录下的命令个数,可以使用如下命令: ls /bin | wc -l
grep 命令
grep - global search regular expression and print lines matching a pattern
grep 是个很强大的命令,用来找到文件中的匹配文本,并且能够接受正则表达式和通配符,同时可以用多个 grep 命令选项来生成各种格式的输出。
grep 的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到标准输出,不影响原文件内容。
grep 可用于 shell 脚本,因为 grep 通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回 0,如果搜索不成功,则返回 1,如果搜索的文件不存在,则返回 2。我们利用这些返回值就可进行一些自动化的文本处理工作。
命令格式:
grep 【选项】 pattern [file]
常用参数:
-c 计算找到 ‘搜寻字符串’(即 pattern) 的次数
-i 忽略大小写的不同,所以大小写视为相同
-n 输出行号
-v 反向选择,打印不匹配的行
-r 递归搜索
–color=auto 将找到的关键词部分加上颜色显示
常用范例:
将/etc/passwd 文件中出现 root 的行取出来,关键词部分加上颜色显示
grep "root" /etc/passwd [--color=auto]
cat /etc/passwd | grep "root"
验证固定电话,打印符合条件的电话
grep “^0[0-9]{2,3}-[0-9]{7,8}(-[0-9]{3,4})?$” telphone.txt
grep 与正则表达式
xargs 命令
我们可以用管道将一个命令的stdout重定向到另一个命令的stdin,但有些命令只能以命令行参数
的形式接收数据,而无法通过stdin接收数据流。在这种情况下,无法通过管道将数据重定向给这些命令。
这时 xargs 就可以发挥它的作用了,xargs命令可以从标准输入接收输入,并把输入转换为一个特定的参数列表。
命令格式:
command | xargs [选项] [command]
xargs 命令应该紧跟在管道操作符之后,因为它以标准输入作为主要的源数据流
常用参数:
-n 指定每行最大的参数数量
-d 指定分割符
常用范例:
cat a.txt | xargs
将多行输入转换为单行输出
echo "1 2 3 4 5 6 7" | xargs -n 3
将单行输入转换为多行输出
cat b.txt | xargs -d i -n 3
将单行输入转换为多行输出,指定分隔符为 i
find . -type f -name "*.c" | xargs wc -l
查找当前目录下所有 c 代码文件,统计总行数