0%

Linux Shell指令

当初开始学习Linux shell指令时做的笔记,现在迁移到自己的博客网站。包括常用的shell指令以及对应的常用选项和示例。注意,这只是一份快速参考,有关shell指令更详细的信息,请参考man文档。

文件处理命令

touch

创建空文件。

1
2
# 创建文件 /path/to/file,如果文件存在,则会更新文件时间。
touch /path/to/file

cat

查看文件内容。

1
2
3
cat /path/to/file
cat -n file # 显示行号
cat -A file # 显示控制字符

tac

反向显示文件内容,即先输出最后一行。

more

分页显示文件内容,但是不可以向上翻页。

1
more /path/to/file
交互命令 说明
space 或 f 翻页
enter 换行
q 或 Q 退出
/ 搜索

less

分页显示文件内容,可以向上翻页。其余与more指令相同。

显示文件前面几行,默认只显示10行。

1
2
3
head /path/to/file
head -n 15 /path/to/file # 显示前15行
head -n -15 /path/to/file # 最后的15行不显示

tail

显示文件的最后几行,默认只显示10行。

1
2
3
tail -n 15 /path/to/file # 显示最后15行
tail -n +15 /path/to/file # 从第15行开始显示到最后一行
tail -f /path/to/file # 动态追加文件的内容,可用于日志的实时查看

ln

创建软链接或硬链接文件。

1
2
ln source_file hardlink_file
ln -s source_file softlink_file

软链接:

硬链接:

rename

批量重命名。

  • -n 只显示将被重命名的文件,而非实际进行重命名操作。
  • -v 打印被成功重命名的文件
  • -f 覆盖已经存在的文件
1
2
3
4
5
6
# 将所有文件的文件名中的所有str1替换为str2。g表示全部匹配,否则只匹配第一个。
rename 's/str1/str2/g' *
# 删除所有文件文件名中的str1
rename 's/str1//g' *
# 所有文件的文件名添加前缀 prefix_
rename 's/^/prefix_/' *

目录处理命令

ls

显示目录文件。

1
ls [-aAldi] /path/to/file
  • -a 显示所有文件,包括隐藏文件。
  • -A 显示所有文件,不包括 . 和 …
  • -l 显示详细信息。
  • -d 显示目录本身的信息,而不是此目录下的文件。
  • -i 查看i节点

mkdir

创建目录。

1
mkdir [-p] /path/to/dir
  • -p 递归创建。如果父目录不存在,则先创建父目录,再创建子目录。

cd

切换当前工作目录。这是一个shell内置命令。

1
2
3
4
5
cd /path/to/dir # 切换到指定目录
cd # 不加任何选项,默认回到家目录
cd ~ # ~ 表示家目录
cd - # 回到上一个工作目录
cd .. # 回到上一级目录

pwd

打印当前工作目录,绝对路径。

basename

去除文件名的目录和前缀。编写shell脚本时非常有用。

1
2
$ basename /path/to/filename
filename

dirname

去除文件名的最后一个部分,即得到文件所在路径。编写shell脚本时非常有用。

1
2
$ dirname /path/to/filename
/path/to

rmdir

删除空目录,实际几乎用不到。

1
rmdir /path/to/dir

cp

复制文件或目录。

1
cp [-rpf] source destination
  • -r 递归复制文件夹。复制文件夹时不带此选项会报错。
  • -p 保留文件属性。
  • -f 强制复制。

注:如果destination不存在,但父目录存在,则会更改名字。

mv

移动文件或更改文件名。

1
mv source destination

注:如果destination不存在,但父目录存在,则是更改文件名。

rm

删除文件或目录。

1
rm [-rf] /path/to/file
  • -r 递归删除
  • -f 强制删除。否则,可能会逐个文件确认是否删除。

注意,rm -rf /*是个非常非常非常可怕的指令。如果感兴趣,可以在虚拟机上做个试验,记得提前拍个快照。

权限管理命令

chmod

更改文件或目录的权限。只有文件的所有者和root用户才能执行此操作。

1
2
chmod [{ugoa}{+-=}{rwx}] filename [-R]
chmod [权限的数字表示] filename [-R]
  • -R 递归修改

示例:

1
2
3
chmod g+w,o-r filename # 所属用户组添加写权限,其他用户去除读权限
chmod g=rwx * -R # 修改当前目录下所有文件的用户组权限为rwx
chmod 755 filename # 设置文件权限为755

在Linux下,文件的权限可以用数字来表示。即rwxrw-r--也可以用764来表示。注意,这是八进制。

权限 八进制 二进制
r 4 100
w 2 010
x 1 001

同样的权限,对文件和目录可能有不同的意义。下表总结了权限所代表的意义。

权限 对文件的意义 对目录的意义
r,读 可以查看文件的内容
cat/more/head/less
可以列出目录中的文件
ls
w,写 可以修改文件
vim
可以在目录创建修改文件
touch/mkdir/rmdir/rm
x,执行 可以执行文件 可以进入目录
cd

注:

  1. 对目录,rx权限一般都有。
  2. 是否可以删除一个文件,是看目录有没有w权限,而不是看文件是否有w权限。
  3. 权限有继承关系,如果对一个文件有相应的权限,而对目录没有,一样无法查看或执行。

chown

更改文件的所有者。只有root用户才可以更改文件的所有者。可以使用sudo暂时提升权限。

1
chown [用户名] [文件名] [-R]
  • -R 递归修改

chgrp

更改文件的所属组。

1
chgrp [用户组] [文件名] [-R]
  • -R 递归修改

注:chown可以在更改文件所有者的同时修改文件所属组。

1
chown user:grp filename # 文件的所有者更改为user,所属组更改为grp

umask

显示、设置新建文件的权限掩码。这是一个shell内置命令。

1
umask [-S]
  • -S 已rwx形式显示新建文件的默认权限。
1
2
3
4
5
6
7
$ umask
0022 # 实际权限的补码
$ umask -S
u=rwx,g=rx,o=rx
$ umask 027
$ umask -S
u=rwx,g=rx,o=

注意:为了安全考虑,无论权限掩码如何设置,新建的文件是不具有x权限的。

搜索命令

find

最常用的文件搜索命令,但是比较慢。

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
find /etc -name init # 在/etc目录下查找名为init的文件
find /etc -name *init* # 模糊搜索,'*'匹配0个或多个字符
find /etc -name init??? # '?'匹配单个字符

# 在根目录下查找大于100MB的文件
# +n 大于,-n 小于,n 等于
# 单位是数据块,一个数据块等于512字节。
find / -size +204800

# 在/home目录下查找所有者为username的文件
# -group 根据所属组查找
find /home -user username

# 在/etc下查找5分钟内被修改过属性的文件,+5表示超过5分钟
# -amin 访问时间,access
# -cmin 文件属性改变时间 change
# -mmin 文件内容改变时间 modify
find /etc -cmin -5

# 在/etc目录下查找普通文件
# f 文件,d 目录,l 软链接
find /etc -type f

# 条件组合
# -a 与,-o 或,! 排除
find /etc -size +163840 -a -size -204800
find /etc -type f ! -name *.conf # 在/etc目录下查找所有不以conf结尾的普通文件

# 查找文件后执行指定的shell指令,{} 指代文件名
find /etc -name init -exec ls -l {} \;

locate

在数据库中查找文件,速度快,但是新创建的文件可能没有收录到数据库。可以使用指令updatedb更新数据库。
选项:

  • -i 忽略大小写
1
locate filename # 查找名为filename的文件

which

which command_name

搜索命令所在路径及别名信息。

1
2
3
4
5
# 查找which命令所在的路径
$ which which
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
/usr/bin/alias
/usr/bin/which

whereis

whichis command_name

搜索命令所在目录及帮助文档路径。

type

type command_name

查看命令的类型。

1
2
3
4
5
6
7
[root@localhost ~]# type type
type is a shell builtin
[root@localhost ~]# type cd
cd is a shell builtin
[root@localhost ~]# type ls
ls is aliased to `ls --color=auto'
[root@pkserver ~]#

grep

grep [选项] [字符串] [文件]

在文件中搜索字符串匹配的行并输出。

选项:

  • -i 不区分大小写
  • -n 输出行号
  • -s 不输出报错信息
  • -w 整词匹配
  • -v 排除指定字符串,即输出不匹配的行
1
2
# 不显示 # 号开头的行。^ 表示匹配行首。
grep -v ^# /etc/inittab

帮助命令

man

man [section] page

查看帮助手册。为了快速定位,man将手册分为9个section,说明如下表所示。

section number description
1 Executable programs or shell commands
2 System calls (functions provided by the kernel)
3 Library calls (functions within program libraries)
4 Special files (usually found in /dev)
5 File formats and conventions eg /etc/passwd
6 Games
7 Miscellaneous (including macro packages and conventions), e.g. man(7),groff(7)
8 System administration commands (usually only for root)
9 Kernel routines [Non standard]

info

与man类似,只是显示内容的形式不一样。

help

help command_name

查看shell内置命令的帮助。

whatis

whatis command_name

查看命令的简短信息。

压缩解压命令

gzip

gzip filename

将文件压缩成filename.gz,会删除源文件。只能压缩当个文件,不能压缩文件夹。

gunzip

gunzip filename.gz

解压缩,与gzip -d可以达到同样的效果。

tar

格式 压缩 解压
tar tar -cf file.tar filelist tar -xf file.tar
tar.gz tar -czf file.tar.gz filelist tar -xzf file.tar.gz
tar.bz2 tar -cjf file.tar.bz2 filelist tar -xjf file.tar.bz2
tar.Z tar -cZf file.tar.Z filelist tar -xZf file.tar.Z

选项说明:

  • -c 打包,但是不压缩
  • -x 解包
  • -f 指定文件名
  • -z tar.gz格式
  • -j tar.bz2格式
  • -Z tar.Z格式
  • -v 显示详细信息
  • -C 指定解压文件存放的目录

zip

压缩成zip格式。

zip -r 压缩后的文件名 文件或目录

unzip

解压zip文件。

unzip file.zip

网络命令

write

wall

ping

ifconfig

mail

traceroute

netstat

系统维护命令

last

列出目前与过去登入系统的用户信息。每个用户的每次登录都会产生一个条目。

lastlog

检查特定用户上次登录的时间。

lastlog [-u uid]

mount

挂载文件系统。

mount [-t type] [-o opt] device mount_point

  • mount -t iso9660 /dev/sr0 /mnt/chrom # 挂载光盘
  • mount -t cifs //hostname/dirname /mountpoint -o username=name # 挂载samba
  • mount -o remount,rw /mountpoint # 重新挂载为可读写

umount

取消挂载。

umount 设备文件名或挂载点

shutdown

logout

who

查看登录用户信息。

w

查看登录用户详细信息。

whoami

查看自己的用户名。

df

查看分区的信息,包括文件系统、已用空间、可用空间、总空间、挂载点等。

df [-mgh] [mountpoint]

  • -m 单位是MB
  • -g 单位是GB
  • -h 人性化显示,自动选择合适的单位

du

查看文件或文件夹的大小。

uptime

查看系统连续运行的时间。

runlevel

查看系统的运行级别。