Linux系统Shell基本命令

下面是经常使用到的Linux系统Shell基本命令,这里汇总一下,便于以后查阅。

1. 命令入门

命令提示符详解

进入Linux系统,通过root用户登录,会出现[root@localhost ~]#,含义为:

  • 用户名root
  • 主机名localhost
  • 当前用户目录~
  • #为系统权限

而普通用户[lucy@localhost ~]$中的$为普通权限。

~为当前用户目录,在别的目录下只会显示目录名。

root为超级管理员,拥有一切系统权限,可通过cd ~进入root用户主目录下,普通用户lucy,可通过~lucy进入其主目录下。

命令格式

命令 选项 参数 (三者之间要有空格,区分大小写)command [-options] [args]

[args]为参,多个参数之间用空格分隔。

2. help命令

2.1 help

使用help查看内建命令的帮助(enable查看内建命令)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@layne ~]# help -s cd
cd: cd [-L|-P] [dir]
[root@layne ~]# help -d cd
cd - Change the shell working directory.
[root@layne ~]# help -m cd
NAME
cd - Change the shell working directory.

SYNOPSIS
cd [-L|-P] [dir]

DESCRIPTION
Change the shell working directory.

Change the current directory to DIR. The default DIR is the value of the
HOME shell variable.

The variable CDPATH defines the search path for the directory containing
DIR. Alternative directory names in CDPATH are separated by a colon (:).
A null directory name is the same as the current directory. If DIR begins
with a slash (/), then CDPATH is not used.
...

但是help只能查看内建命令,比如我想查看mv的帮助信息就不行:

1
2
[root@layne ~]# help mv
-bash: help: no help topics match `mv'. Try `help help' or `man -k mv' or `info mv'.

那么我们怎么知道哪些是内建命令呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
[root@layne ~]# enable
enable .
enable :
enable [
enable alias
enable bg
enable bind
enable break
enable builtin
enable caller
enable cd
enable command
enable compgen
enable complete
enable compopt
enable continue
enable declare
enable dirs
enable disown
enable echo
enable enable
enable eval
enable exec
enable exit
enable export
enable false
enable fc
enable fg
enable getopts
enable hash
enable help
enable history
enable jobs
enable kill
enable let
enable local
enable logout
enable mapfile
enable popd
enable printf
enable pushd
enable pwd
enable read
enable readarray
enable readonly
enable return
enable set
enable shift
enable shopt
enable source
enable suspend
enable test
enable times
enable trap
enable true
enable type
enable typeset
enable ulimit
enable umask
enable unalias
enable unset
enable wait

enable也不用背,该方式比较费时间,help无法使用时,根据提示换其他帮助方式就ok了。

2.2 --help

如输入mv --help可查看mv的命令介绍。

3. man命令

操作快捷键:

  • enter向下一行
  • 空格按页向下翻,b向上翻页 或 ctrl +f向下翻页,ctrl+b向上翻页
  • p直接翻到首页
  • 查找按 /要查找的内容,查找 下一个/上一个:按n/N(即Shift +n);
  • 退出按q

man:

  • 1用户命令(/bin,/usr/bin,/usr/local/bin)
  • 2系统调用
  • 3库函数
  • 4特殊文件(设备文件)
  • 5文件格式(配置文件的语法)
  • 6游戏
  • 7杂项(Miscellaneous)
  • 8管理命令(/sbin,/usr/sbin,/usr/local/sbin)

自己尝试以下 man 2 readman read的区别。

4. echo

  • echo $x输出变量x
  • echo "hello"输出字符串
  • echo "hello layne" > log.txt 将输出的内容写入到log.txt,如果文件不存在,则会直接创建文件并写入内容。
  • echo "hello layne123456" >> log.txt将输出的内容追加到log.txt。
  • echo -n表示不要另起新行,如输入echo -n "hello world"
  • -e表示解释逃逸字符,如输入echo -e "hello \nworld"

5. test

几个算术运算符:

  • gt表示greater than,即大于
  • lt表示less than,即小于
  • eq表示equal,即等于
  • ge表示大于等于
  • le表示小于等于

命令:

  • test 3 -gt 2 测试3大于2
  • echo $? 返回上一条命令执行的结果(linux中0表示正确,1表示错误)
  • test 3 -ge 3 && echo 'yes'表示3大于等于3成立,然后执行逻辑与,输出yes
  • test 3 -ge 5 || echo 'no' 表示3大于等于2不成立,然后执行逻辑或,输出no

除了test,还可以用[ ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@node1 ~]# [ 3 -gt 2 ]
[root@node1 ~]# echo $?
0
[root@node1 ~]# [ 5 -lt 2 ]
[root@node1 ~]# echo $?
1
[root@node1 ~]# [ 5 -lt 2]
-bash: [: missing `]'
[root@node1 ~]# [5 -lt 2 ]
-bash: [5: command not found
[root@layne ~]# [ 3 -gt 2 ] && echo 'yes'
yes
[root@layne ~]# mydir=/root
[root@layne ~]# [ -d $mydir ] && echo "$mydir is dir"
/root is dir
  • []和内容之间一定要有空格,否则抛错。
  • [ -d $mydir ] 测试mydir变量是否是一个目录

当在shell中执行命令的时候,默认到PATH指定的路径中查找可执行文件。

如果在PATH中的多个目录都包含该可执行文件,则执行最先找到的。

输入echo $PATH可输出环境变量:

如果执行命令的时候,识别不到任何一个path路径下的命令,会提示命令不识别。

6. type

type打印一个字符串的类型,可能的值为:别名,内置命令,函数,关键字,可执行文件或者什么都不输出(不是前面的类型)。

type命令可以识别外部命令和内部命令(内建命令)

查看命令的type:

1
2
3
4
5
6
7
8
[root@layne ~]# type cd
cd is a shell builtin
[root@layne ~]# type cp
cp is aliased to `cp -i'
[root@layne ~]# type ls
ls is aliased to `ls --color=auto'
[root@layne ~]# type ll
ll is aliased to `ls -l --color=auto'

别名也可以用alias命令查看,如:

1
2
[root@layne ~]# alias ll
alias ll='ls -l --color=auto'

查看yum命令的类型:

1
2
[root@layne ~]# type yum
yum is hashed (/usr/bin/yum)

yum是外部命令

7. file

file命令:检查文件的类型。

1
2
[root@layne ~]# file /usr/bin/yum
/usr/bin/yum: a /usr/bin/python script text executable

yum命令是外部命令,它的文件是python脚本类型文件。

1
2
[root@layne ~]# file /bin/ls
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped

ls是二进制可执行文件(ELF)。

8. ls

ls命令用于列出目录内容

  • ls -a / 显示根目录下所有文件
  • ls -l / 以格式化的形式显示文件
  • ls -a -l 以格式化形式显示根目录下所有文件
  • ls -ali / 列出文件和目录的inode信息(相当于c语言的指针)
  • ls / /usr可以后面跟多个目录,列出多个目录的内容
  • ll相当于ls -l --color=auto
  • ls 等于ls ./

ls也支持通配符

  • ls *log
  • ls install*
  • ls \*tall\*

9. pwd和history

pwd打印当前工作目录路径

history打印历史命令

10. cd

cd用于更改shell工作目录,也就是切换目录,cd全称是change directory

如果cd后什么都不写,表示直接回当前用户家目录,在root下相当于cd ~

cd后也可以跟减号(-)用以表示回到最后一次切换之前的目录,多次使用减号在最近两个目录之间切换

root用户可以直接通过绝对路径进到普通用户的家目录,也可以直接跟波浪线用户名表示直接进入到某个用户的家目录

1
2
3
cd /home/god #切换到god家目录
cd ~bjsxt #到用户bjsxt家中去
cd ~ #到root家目录

超级管理员root的家目录在根目录下,即/root,普通用户的家目录在home下。

11. ps

可以通过命令查看系统内进程信息(查看当前运行的进程信息)

进程查看命令ps(process status) :将某个时间点的程序运作情况截取下来

选项和参数 :

  • a : 显示所有程序
  • x :显示所有程序,不区分终端机
  • u :以用户为主的格式来显示

常用组合 :

ps aux 观察系统所有的进程数据

ps -ef 显示所有进程基本信息(比aux较简略一些)

ps -ef|grep mysql 查看有关mysql的进程

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@layne ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 19232 1496 ? Ss 10:15 0:03 /sbin/init
root 2 0.0 0.0 0 0 ? S 10:15 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 10:15 0:00 [migration/0]
root 4 0.0 0.0 0 0 ? S 10:15 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S 10:15 0:00 [migration/0]
root 6 0.0 0.0 0 0 ? S 10:15 0:00 [watchdog/0]
root 1333 0.0 0.0 4064 592 tty1 Ss+ 10:15 0:00 /sbin/mingetty /dev/tty1
root 1335 0.0 0.0 4064 588 tty2 Ss+ 10:15 0:00 /sbin/mingetty /dev/tty2
root 1337 0.0 0.0 4064 592 tty3 Ss+ 10:15 0:00 /sbin/mingetty /dev/tty3
root 1339 0.0 0.0 4064 588 tty4 Ss+ 10:15 0:00 /sbin/mingetty /dev/tty4
root 1341 0.0 0.0 4064 584 tty5 Ss+ 10:15 0:00 /sbin/mingetty /dev/tty5
root 1343 0.0 0.0 4064 588 tty6 Ss+ 10:15 0:00 /sbin/mingetty /dev/tty6
root 1346 0.0 0.1 10944 1032 ? S< 10:15 0:00 /sbin/udevd -d
root 1347 0.0 0.1 10944 1032 ? S< 10:15 0:00 /sbin/udevd -d
root 1417 0.0 0.5 144452 5072 pts/1 T 11:07 0:00 vim .bashrc
root 1751 0.0 0.1 110216 1092 pts/1 R+ 13:35 0:00 ps aux

下为各选项的含义:

  • USER:该 process 属于那个使用者
  • PID :该 process 的程序标识符。
  • %CPU:该 process 使用掉的 CPU 资源百分比;
  • %MEM:该 process 所占用的物理内存百分比;
  • VSZ :该 process 使用掉的虚拟内存量 (Kbytes)
  • RSS :该 process 占用的物理的内存量 (Kbytes)
  • TTY :该 process 是在那个终端机上面运作,若与终端机无关则显示 ?。另外,tty1-tty6 是本机上面的登入者程序,若为 pts/0 等,则表示为由网络连接进主机的程序
  • STAT:该进程目前的状态,状态显示与ps -l的 S 旗标相同 (R/S/D/T/Z)
  • START:该 process 被触发启动的时间
  • TIME :该 process 实际使用 CPU 运作的时间。
  • COMMAND:该程序的实际命令

另外,输入ps -ef如下:

1
2
3
4
5
6
7
8
9
10
[root@layne ~]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 10:15 ? 00:00:03 /sbin/init
root 2 0 0 10:15 ? 00:00:00 [kthreadd]
root 3 2 0 10:15 ? 00:00:00 [migration/0]
root 4 2 0 10:15 ? 00:00:00 [ksoftirqd/0]
root 5 2 0 10:15 ? 00:00:00 [migration/0]
root 6 2 0 10:15 ? 00:00:00 [watchdog/0]
root 7 2 0 10:15 ? 00:00:11 [events/0]
...
  • STIME 该进程什么时候启动的
  • PPID 为进程的父进程ID

12. pstree

Linux pstree命令将所有行程以树状图显示

  • ps查看进程数

13. mkdir

mkdir用于创建目录

  • mkdir a1 a2 a3 创建目录a1、a2、a3
  • mkdir -p a/b/c 可以添加**-p**选项,用以创建多层目录,因为系统发现某一级目录不存在的时候创建父目录
  • mkdir ./abc/1dir ./abc/2dir ./abc/3dir 用于一次性创建多个目录

可以使用大括号高效创建相似的目录

1
2
3
mkdir ./abc/{x,y,z}dir  (不连续的) #创建xdir、ydir、zdir目录
mkdir ./abc/{x..z}dir (连续的) # 创建xdir、ydir、zdir目录
mkdir b{1..3} #创建b1、b2、b3目录

touch用于创建文件,如torch a.txt创建文件a.txt

touch a.txt b.txt 创建两个文件

14、rm

删除之前一定要备份,打包加日期。除非确定以后真的不用了

rm用于删除文件

  • rm a.txt 删除文件a.txt,需要按y确认删除
  • rm -f file,删除文件,不需要确认强制删除

如果rm的参数是目录,则会提示需要迭代删除而不能成功

  • rm -r dira 用于删除目录
  • rm -rf dira 删除目录,不要确认,此命令慎用

尤其是 rm -rf /,这个命令直接删除整个Linux操作系统

15. cp

cp用于拷贝文件

  • cp a.txt b.txt abc/ 拷贝两个文件到abc目录下
  • cp /root/install.log /root/abc/xdir/ 也可以是绝对路径
  • cp ~/install.log . 拷贝用户目录下的文件到当前文件夹下
  • cp a.txt zz.txt 将文件a.txt复制为zz.txt

cp -r 目录 目标目录 用于拷贝整个目录

  • cp -r efg/ abc/ 拷贝efg文件夹到abc文件夹下

加上-f 表示覆盖已经存在的目标文件而不给出提示。但是,我试了还是提示我覆盖,哈哈,以后有时间再试试

16. mv

mv用于移动或重命名文件

既可以移动文件,也可以移动目录,即可为文件改变,也可以为目录改名。

  • mv a.txt b.txt x/y 复制两个文件到x/y目录下
  • mv abc/ x/y 复制目录abc到x/y目录下

Linux中没有专门改名的命令,mv兼职改名工作:

  • mv zdir zzdir 将zdir目录改名为zzdir
  • mv zz.txt zk.txt 将zz.txt文件改名为zk.txt

17. ln

ln 用于创建硬链接或软链接

创建硬链接

1
2
[root@layne laydir]# cp /etc/profile ./
[root@layne laydir]# ln profile ln1

创建软链接

让ln2指向profile, 给profile创建软链接

1
[root@layne laydir]# ln -s profile ln2

创建完两个链接后,修改ln1、ln2、profile任何一个文件的内容,都会导致这三个文件改变,说明确实实现了链接的功能。

输入ll -i

在 Linux 中,元数据中的 inode 号(inode 是文件元数据的一部分但其并不包含文件名,inode 号即索引节点号)才是文件的唯一标识而非文件名。文件名仅是为了方便人们的记忆和使用,系统或程序通过 inode 号寻找正确的文件数据块。

文件的 inode 值,可以简单把它想成 C 语言中的指针,它指向了物理硬盘的一个区块。只要一个文件的inode存在,它就不会从硬盘上消失。

看上图,可以发现:

  • 硬链接和原文件的inode信息一样,软链接和原文件的inode信息不一样。
  • 软链接ln2的类型是l,说明是链接类型,而硬链接ln1和原文件的类型都是-,说明这两个都是文件类型。
  • 图片上也显示了lln2->profile,说明ln2这个链接指向profile文件

下面我试着删除 profile 文件,然后通过cat命令分别输出软硬链接的文件内容:

删除文件后,硬链接ln1输出了profile文件里面的内容,软链接ln2报错cat: ln2: No such file or directory

这说明,硬链接ln1没有丝毫地影响,因为它的 inode 所指向的区块由于有一个硬链接在指向它,所以这个区块仍然有效,并且可以访问到。然而软链接的 inode 所指向的内容实际上是保存了一个绝对路径,当用户访问这个文件时,系统会自动将其替换成其所指的文件路径,由于这个文件已经被删除了,所以自然就会显示无法找到该文件了。

接下来,我向这个软连接ln2写点东西,会发现刚才删除的profile文件竟然又出现了这就说明,当我们写入访问软链接时,系统自动将其路径替换为其所代表的绝对路径,并直接访问那个路径了。

参考:“软链接”和“硬链接”的区别

18. du

du (英文全拼:disk usage)命令用于显示目录或文件的大小。

du 会显示指定的目录或文件所占用的磁盘空间。

  • a :列出所有的文件与目录容量
  • h :以人们较易读的容量格式(G/M/K)显示
  • s :summarize 仅显示总计。
  • k :以 KBytes 列出容量显示
  • m :以 MBytes 列出容量显示

du /root统计/root下的目录或文件所占用的磁盘空间。(如果只输入du表示统计当前目录下的)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@layne laydir]# du /root
4 /root/b7/b3
4 /root/b7/etc/cron.monthly
4 /root/b7/etc/blkid
160 /root/b7/etc/ssh
8 /root/b7/etc/xdg/autostart
12 /root/b7/etc/xdg
316 /root/b7/etc/pki/ca-trust/extracted/openssl
180 /root/b7/etc/pki/ca-trust/extracted/java
604 /root/b7/etc/pki/ca-trust/extracted/pem
1108 /root/b7/etc/pki/ca-trust/extracted
4 /root/b7/etc/pki/ca-trust/source/blacklist
4 /root/b7/etc/pki/ca-trust/source/anchors
...

添加-s参数可以生成指定目录的汇总信息,也就是共占用多大的磁盘空间

1
2
[root@layne laydir]# du -s /root
58384 /root

添加-h参数可以显示为人类可以读懂的格式

1
2
[root@layne laydir]# du -sh /root
58M /root

将路径写成./*统计当前目录下每项内容占用的磁盘空间信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@layne laydir]# du -sh /root/*
40K /root/1611819376845.png
4.0K /root/anaconda-ks.cfg
40M /root/b7
16K /root/day5
12K /root/install.log
4.0K /root/install.log.syslog
28K /root/layne
4.0K /root/log.txt
15M /root/manpages-zh-1.5.1
1.9M /root/manpages-zh-1.5.1.tar.gz
52K /root/my
4.0K /root/profile
4.0K /root/test1.txt
4.0K /root/test.txt
4.0K /root/TRANS.TBL

查看/usr/local目录下共占用多大磁盘空间

1
2
[root@layne laydir]# du -sh /usr/local
7.0M /usr/local

19. stat

stat命令用于显示inode内容。

stat以文字的格式来显示inode的内容。

例如,查看 etc下的profile文件的inode内容内容,可以用以下命令:

1
2
3
4
5
6
7
8
[root@layne laydir]# stat /etc/profile
File: `/etc/profile'
Size: 1896 Blocks: 8 IO Block: 4096 regular file
Device: 803h/2051d Inode: 131623 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2021-02-07 10:15:36.277006386 +0800
Modify: 2021-02-05 19:43:06.556412802 +0800
Change: 2021-02-05 19:43:06.589413340 +0800

20. touch

用于创建文件

touch a.txt b.txt 创建a.txt和b.txt

touch 对于已存在的文件,抹平各个时间(不会改变里面的内容

touch 对于不存在的文件,则创建文件

21. kill

杀死进程

kill -9 pid (见人就杀,不做善后工作)

kill -15 pid (调用destory方法善后,)

优先使用 -15,因为-15温柔一些,会做一些善后的处理,不行再用-9

22. whereis

作用:locate the binary, source, and manual page files for a command.即:定位/返回与指定名字匹配的二进制文件(参数-b)、源文件(参数-s)和man帮助手册(参数-m)文件所在的路径。如果省略参数,则返回所有信息。

和find相比,whereis查找的速度非常快,这是因为linux系统会将系统内的所有文件都记录在一个数据库文件中,当使用whereis和下面即将介绍的locate时,会从数据库中查找数据,而不是像find命令那样,通过遍历硬盘来查找,效率自然会很高。

但是该数据库文件并不是实时更新,默认情况下时每天自动更新一次,因此,我们在用whereis和locate 查找文件时,有时会找到已经被删除的数据,或者刚刚建立文件,却无法查找到,原因就是因为数据库文件没有被更新。 可以通过updatedb去读取 /etc/updatedb.conf 这个配置文件的设定,更新整个数据库!因为 updatedb 会去查找硬盘,所以执行 updatedb ,可能会等待数分钟。

原理:whereis命令首先会去掉filename中的前缀空格和以.开头的任何字符,然后再在数据库(var/lib/slocate/slocate.db)中查找与上述处理后的filename相匹配的二进制文件、源文件和帮助手册文件,使用之前可以使用updatedb命令手动更新数据库。

命令参数:

-b 定位可执行文件。

-m 定位帮助文件。

-s 定位源代码文件。

-u 搜索默认路径下除可执行文件、源代码文件、帮助文件以外的其它文件。

-B 指定搜索可执行文件的路径。

-M 指定搜索帮助文件的路径。

-S 指定搜索源代码文件的路径。

适用场合:二进制文件、源文件和帮助手册文件路径的查找。

1
2
3
[root@layne apps]# whereis java
java: /usr/bin/java
[root@layne apps]#

23. locate

locate而且使用范围比whereis大的多,只需要部分文件名就可以进行模糊查询,同时locte还可以通过-r选项使用正则表达式,功能十分强大。与whereis一样 locate使用的索引数据库里的信息并不一定是实时有效的,可以使用updatedb命令更新索引数据库。

原理:默认情况下(当filename中不包含通配符),locate会给出所有与filename相匹配的文件的路径。

适用场合:没有文件类型性质的模糊查找(你只记得某个文件的部分名称)。

1
2
3
4
5
6
[root@layne apps]# locate java|head -n 5
/etc/.java
/etc/.java/.systemPrefs
/etc/.java/.systemPrefs/.system.lock
/etc/.java/.systemPrefs/.systemRootModFile
/etc/pki/java

24. find

参数说明:

时间查找参数:

  • -atime n: 在过去n天内被读取过的文件
  • -cmin n : 在过去 n 分钟内被创建的文件 (按文件创建时间来查找文件)
  • -mmin n:在过去 n 分钟内被修改过的文件(按文件更改时间来查找文件)
  • -ctime n: 在过去n天内被创建的文件(按文件创建时间来查找文件)
  • -mtime n: 在过去n天内被修改过的文件(按文件更改时间来查找文件)
  • -newer file: 把比file还要新的文件列出来

名称查找参数:

  • -gid n: 寻找群组ID为n的文件
  • -group name: 寻找群组名称为name的文件
  • -uid n: 寻找拥有者ID为n的文件
  • -user name: 寻找拥有者名称为name的文件
  • -name file: 寻找文件名为file的文件(可以使用通配符)

其它参数:

  • -type c : 文件类型是 c 的文件。
    • d: 目录
    • c: 字型装置文件
    • b: 区块装置文件
    • p: 具名贮列
    • f: 一般文件
    • l: 符号连结
    • s: socket
  • -size n[c] #查长度为n块[或n字节]的文件
  • -user username #按文件属主来查找
  • -group groupname #按组来查找

作用:search for files in a directory hierarchy. 从当前目录递归的搜索文件(通过遍历硬盘来查找)。

这里介绍一下时间查找参数的含义,以-mtime参数为例

1
2
3
-mtime n :n 为数字,意义为在 n 天之前被更改过的文件; 
+n :列出在 n 天(不含你、)之前被更改过的文
-n :列出在 n 天之内(包含 n 天本身)被更改过内容的文件。

比如

1
2
3
+4代表>=5天前的文件名:ex> find /var -mtime +4 #查看/var目录下>=5天前的文件名
-4代表<=4天内的文件名:ex> find /var -mtime -4
4则是代表4-5那一天的文件名:ex> find /var -mtime 4

find的使用实例:

  • find . -name "*.c" 将当前目录及其子目录下所有文件后缀为 .c 的文件列出来

  • find . -type f 将目前目录其其下子目录中所有一般文件列出

  • find . -ctime -20 将当前目录及其子目录下所有最近 20 天内更新过的文件列出

  • find /var/log -type f -mtime +7 -ok rm {} \; 查找 /var/log 目录中更改时间在 7 日以前的普通文件,并在删除之前询问它们

  • find . -type f -mmin -10 搜索当前目录中,所有过去10分钟中更新过的普通文件。如果不加-type f参数,则搜索普通文件+特殊文件+目录。

  • find . -name "my*" -ls 搜索当前目录中,所有文件名以my开头的文件,并显示它们的详细信息。

  • find /home -size +512k 查大于512k的文件

  • find /home -size -512k 查小于512k的文件

  • find /home -user noas 找到目下下所有该用户的文件

  • find / -nouser #找到不数据任何用户的文件

25. pstree

pstree 打印进程树(有的子进程折叠)

pstree -p打印并展开所有的进程树,并显示每个进程的id

26. read

read命令用于从标准输入读取数值。

read 内部命令被用来从标准输入读取单行数据。这个命令可以用来读取键盘输入,当使用重定向的时候,可以读取文件中的一行数据。

语法:read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]

参数说明:

  • -a 后跟一个变量,该变量会被认为是个数组,然后给其赋值,默认是以空格为分割符。
  • -d 后面跟一个标志符,其实只有其后的第一个字符有用,作为结束的标志。
  • -p 后面跟提示信息,即在输入前打印提示信息。
  • -e 在输入的时候可以使用命令补全功能。
  • -n 后跟一个数字,定义输入文本的长度,很实用。
  • -r 屏蔽\,如果没有该选项,则\作为一个转义字符,有的话 \就是个正常的字符了。
  • -s 安静模式,在输入字符时不再屏幕上显示,例如login时输入密码。
  • -t 后面跟秒数,定义输入字符的等待时间。
  • -u 后面跟fd,从文件描述符中读入,该文件描述符可以是exec新开启的。

现在来试试吧。

(1)简单读取

创建文件a.sh,内容为:

1
2
3
4
5
6
7
8
#!/bin/bash

#这里默认会换行
echo "输入网站名: "
#读取从键盘的输入
read website
echo "你输入的网站名是 $website"
exit 0 #退出

执行:

1
2
3
4
5
6
[root@layne rdir]# chmod +x a.sh
[root@layne rdir]# ./a.sh
输入网站名:
layne
你输入的网站名是 layne
[root@layne rdir]#

(2)-p 参数,允许在 read 命令行中直接指定一个提示。

创建文件b.sh,内容为:

1
2
3
4
5
#!/bin/bash

read -p "输入网站名:" website
echo "你输入的网站名是 $website"
exit 0

执行:

1
2
3
4
[root@layne rdir]# chmod +x b.sh
[root@layne rdir]# ./b.sh
输入网站名:layne
你输入的网站名是 layne

(3)-t 参数指定 read 命令等待输入的秒数,当计时满时,read命令返回一个非零退出状态。

创建c.sh,内容:

1
2
3
4
5
6
7
8
9
#!/bin/bash

if read -t 5 -p "输入网站名:" website
then
echo "你输入的网站名是 $website"
else
echo "\n抱歉,你输入超时了。"
fi
exit 0

执行(不输入,等待 5 秒后):

1
2
3
[root@layne rdir]# chmod +x c.sh
[root@layne rdir]# ./c.sh
输入网站名:\n抱歉,你输入超时了。

(4)除了输入时间计时,还可以使用 -n 参数设置 read 命令计数输入的字符。当输入的字符数目达到预定数目时,自动退出,并将输入的数据赋值给变量。

创建d.sh,内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash

read -n1 -p "Do you want to continue [Y/N]?" answer
case $answer in
Y | y)
echo "fine ,continue";;
N | n)
echo "ok,good bye";;
*)
echo "error choice";;

esac
exit 0

执行:

1
2
3
[root@layne rdir]# chmod +x d.sh
[root@layne rdir]# ./d.sh
Do you want to continue [Y/N]?yfine ,continue

该例子使用了-n 选项,后接数值 1,指示 read 命令只要接受到一个字符就退出。只要按下一个字符进行回答,read 命令立即接受输入并将其传给变量,无需按回车键。

(5)-s 选项能够使 read 命令中输入的数据不显示在命令终端上(实际上,数据是显示的,只是 read 命令将文本颜色设置成与背景相同的颜色)。输入密码常用这个选项。

创建e.sh,内容:

1
2
3
4
5
#!/bin/bash

read -s -p "请输入您的密码:" pass
echo "\n您输入的密码是 $pass"
exit 0

执行:

1
2
3
[root@layne rdir]# chmod +x e.sh
[root@layne rdir]# ./e.sh
请输入您的密码:\n您输入的密码是 123

(6) 读取文件

每次调用 read 命令都会读取文件中的 “一行” 文本。当文件没有可读的行时,read 命令将以非零状态退出。

通过什么样的方法将文件中的数据传给 read 呢?使用 cat 命令并通过管道将结果直接传送给包含 read 命令的 while 命令。

创建test.txt,内容如下:

1
2
3
123
456
layne

创建f.sh,内容为:

1
2
3
4
5
6
7
8
9
10
#!/bin/bash

count=1 # 赋值语句,不加空格
cat test.txt | while read line # cat 命令的输出作为read命令的输入,read读到>的值放在line中
do
echo "Line $count:$line"
count=$[ $count + 1 ] # 注意中括号中的空格。
done
echo "finish"
exit 0

执行:

1
2
3
4
5
6
[root@layne rdir]# chmod +x f.sh
[root@layne rdir]# ./f.sh
Line 1:123
Line 2:456
Line 3:layne
finish

(7)read在不提供参数的时候,会将用户的输入存储在REPLY变量中

1
2
3
4
[root@layne rdir]# read
abc
[root@layne rdir]# echo $REPLY
abc