第三章 常用Shell(Bash)命令

3.1 查看文件和目录

3.1.1 ls命令:列出文件名和目录

ls命令不带任何选项,将列出当前目录下所有文件和目录,但不会显示详细的信息。

[root@hadoop100 ~]# ls
anaconda-ks.cfg  file  initial-setup-ks.cfg  itheima  公共  模板  视频  图片  文档  下载  音乐  桌面

使用-l选项,将每行显示一条记录:

[root@hadoop100 ~]# ls -l
总用量 44
-rw-------. 1 root root 1685 69 16:55 anaconda-ks.cfg
-rw-r--r--. 1 root li      0 617 21:57 file
-rw-r--r--. 1 root root 1733 69 17:01 initial-setup-ks.cfg
drwxr-xr-x. 2 root root 4096 614 21:44 itheima
drwxr-xr-x. 2 root root 4096 610 22:11 公共
drwxr-xr-x. 2 root root 4096 610 22:11 模板
drwxr-xr-x. 2 root root 4096 610 22:11 视频
drwxr-xr-x. 2 root root 4096 610 22:11 图片
drwxr-xr-x. 2 root root 4096 610 22:11 文档
drwxr-xr-x. 2 root root 4096 610 22:11 下载
drwxr-xr-x. 2 root root 4096 610 22:11 音乐
drwxr-xr-x. 2 root root 4096 610 22:11 桌面

使用-l选项,将以长列表格显示文件和目录,包括文件类型、大小、修改日期和时间、权限等信息。
从上面的输出可以看到每行有 7个字段,那么每个字段的含义是什么意思呢?

  • 第一个字符:文件类型。
    • 连字符"-"表示普通文件;
    • d表示目录;
    • s表示套接字文件;
    • l表示链接文件。
  • 字段一:文件权限。接下来的9个字符指示文件的权限。每3个字符分别涉及所有者、用户组和其他用户的读、写、执行权限。
  • 字段二:链接数。1表示只有一个链接到此文件。
  • 字段三:所有者。
  • 字段四:用户组。
  • 字段五:文件大小。默认输出的大小单位是字节。
  • 字段六:文件最近依次被修改的日期时间。
  • 字段七:文件名。

使用-lh选项可以将文件大小显示为符合人类阅读习惯的格式:

[root@hadoop100 ~]# ls -lh
总用量 44K
-rw-------. 1 root root 1.7K 69 16:55 anaconda-ks.cfg
-rw-r--r--. 1 root li      0 617 21:57 file
-rw-r--r--. 1 root root 1.7K 69 17:01 initial-setup-ks.cfg
drwxr-xr-x. 2 root root 4.0K 614 21:44 itheima
drwxr-xr-x. 2 root root 4.0K 610 22:11 公共
drwxr-xr-x. 2 root root 4.0K 610 22:11 模板
drwxr-xr-x. 2 root root 4.0K 610 22:11 视频
drwxr-xr-x. 2 root root 4.0K 610 22:11 图片
drwxr-xr-x. 2 root root 4.0K 610 22:11 文档
drwxr-xr-x. 2 root root 4.0K 610 22:11 下载
drwxr-xr-x. 2 root root 4.0K 610 22:11 音乐
drwxr-xr-x. 2 root root 4.0K 610 22:11 桌面

使用-F选项,将使用不同的特殊字符归类不同的文件类型:

[root@hadoop100 ~]# ls -F
anaconda-ks.cfg  initial-setup-ks.cfg  公共/  视频/  文档/  音乐/
file             itheima/              模板/  图片/  下载/  桌面/

如上例所示:

  • /表示目录
  • 无特殊字符表示普通文件
  • @ 表示链接文件
  • * 表示可执行文件

使用–color=auto命令,将不同的文件类型显示为不同的颜色:

[root@hadoop100 ~]# ls --color=auto
anaconda-ks.cfg  file  initial-setup-ks.cfg  itheima  公共  模板  视频  图片  文档  下载  音乐  桌面

使用-ld选项,可以以长列表格式列出某个目录的信息:

[root@hadoop100 ~]# ls -ld /var/log
drwxr-xr-x. 20 root root 4096 819 09:08 /var/log

使用-R选项,将递归地列出子目录的内容:

[root@hadoop100 ~]# ls -R /etc/sysconfig/
/etc/sysconfig/:
anaconda    crond             kdump            nfs            rpc-rquotad    sysstat
atd         ebtables-config   kernel           ntpd           rsyncd         sysstat.ioconf
authconfig  fcoe              ksm              ntpdate        rsyslog        virtlockd
autofs      firewalld         libvirtd         qemu-ga        run-parts      virtlogd
cbq         grub              man-db           radvd          samba          wpa_supplicant
cgred       init              modules          raid-check     saslauthd
chronyd     ip6tables-config  netconsole       rdisc          selinux
console     iptables-config   network          readonly-root  smartmontools
cpupower    irqbalance        network-scripts  rpcbind        sshd

/etc/sysconfig/cbq:
avpkt  cbq-0000.example

/etc/sysconfig/console:

/etc/sysconfig/modules:

/etc/sysconfig/network-scripts:
ifcfg-ens33  ifdown-ipv6    ifdown-TeamPort  ifup-ippp   ifup-routes       network-functions
ifcfg-lo     ifdown-isdn    ifdown-tunnel    ifup-ipv6   ifup-sit          network-functions-ipv6
ifdown       ifdown-post    ifup             ifup-isdn   ifup-Team
ifdown-bnep  ifdown-ppp     ifup-aliases     ifup-plip   ifup-TeamPort
ifdown-eth   ifdown-routes  ifup-bnep        ifup-plusb  ifup-tunnel
ifdown-ib    ifdown-sit     ifup-eth         ifup-post   ifup-wireless
ifdown-ippp  ifdown-Team    ifup-ib          ifup-ppp    init.ipv6-global
[root@hadoop100 ~]#

联合使用-ltr选项,将以长列表格式按文件或目录的修改时间倒序地列出文件和目录:

[root@hadoop100 ~]# ls -ltr
总用量 44
-rw-------. 1 root root 1685 69 16:55 anaconda-ks.cfg
-rw-r--r--. 1 root root 1733 69 17:01 initial-setup-ks.cfg
drwxr-xr-x. 2 root root 4096 610 22:11 桌面
drwxr-xr-x. 2 root root 4096 610 22:11 音乐
drwxr-xr-x. 2 root root 4096 610 22:11 下载
drwxr-xr-x. 2 root root 4096 610 22:11 文档
drwxr-xr-x. 2 root root 4096 610 22:11 图片
drwxr-xr-x. 2 root root 4096 610 22:11 视频
drwxr-xr-x. 2 root root 4096 610 22:11 模板
drwxr-xr-x. 2 root root 4096 610 22:11 公共
drwxr-xr-x. 2 root root 4096 614 21:44 itheima
-rw-r--r--. 1 root li      0 617 21:57 file

联合使用-ls选项,将以长列表格式按文件大小顺序列出文件和目录:

[root@hadoop100 ~]# ls -ls
总用量 44
4 -rw-------. 1 root root 1685 69 16:55 anaconda-ks.cfg
0 -rw-r--r--. 1 root li      0 617 21:57 file
4 -rw-r--r--. 1 root root 1733 69 17:01 initial-setup-ks.cfg
4 drwxr-xr-x. 2 root root 4096 614 21:44 itheima
4 drwxr-xr-x. 2 root root 4096 610 22:11 公共
4 drwxr-xr-x. 2 root root 4096 610 22:11 模板
4 drwxr-xr-x. 2 root root 4096 610 22:11 视频
4 drwxr-xr-x. 2 root root 4096 610 22:11 图片
4 drwxr-xr-x. 2 root root 4096 610 22:11 文档
4 drwxr-xr-x. 2 root root 4096 610 22:11 下载
4 drwxr-xr-x. 2 root root 4096 610 22:11 音乐
4 drwxr-xr-x. 2 root root 4096 610 22:11 桌面

使用-a选项,将列出包括隐藏文件或目录在内的所有文件和目录,包括".“(当前目录)和”…"(父目录):

[root@hadoop100 ~]# ls -a
.                .bash_logout   .config    file                  .local       公共  文档
..               .bash_profile  .cshrc     .ICEauthority         .tcshrc      模板  下载
anaconda-ks.cfg  .bashrc        .dbus      initial-setup-ks.cfg  .viminfo     视频  音乐
.bash_history    .cache         .esd_auth  itheima               .Xauthority  图片  桌面

使用-A选项,将列出包括隐藏文件或目录(不包含",“和”…")在内的所有文件和目录:

[root@hadoop100 ~]# ls -A
anaconda-ks.cfg  .bashrc  .dbus          initial-setup-ks.cfg  .viminfo     视频  音乐
.bash_history    .cache   .esd_auth      itheima               .Xauthority  图片  桌面
.bash_logout     .config  file           .local                公共         文档
.bash_profile    .cshrc   .ICEauthority  .tcshrc               模板         下载

使用-i选项,将显示文件或目录的inode编号,有时在系统中操作时可能需要直到inode编号:

[root@hadoop100 ~]# ls -i
1846943 anaconda-ks.cfg       1847000 itheima  1847008 视频  1847002 下载
1847028 file                  1847004 公共     1847007 图片  1847006 音乐
1846950 initial-setup-ks.cfg  1847003 模板     1847005 文档  1847001 桌面

注意:在使用find命令中,可以使用inode编号移除文件名中含有特殊字符的文件。

使用-n选项,其输出的内容类似于-l选项,指示显示uid和gid,替代显示所有者和用户组:

[root@hadoop100 ~]# ls -n
总用量 44
-rw-------. 1 0    0 1685 69 16:55 anaconda-ks.cfg
-rw-r--r--. 1 0 1000    0 617 21:57 file
-rw-r--r--. 1 0    0 1733 69 17:01 initial-setup-ks.cfg
drwxr-xr-x. 2 0    0 4096 614 21:44 itheima
drwxr-xr-x. 2 0    0 4096 610 22:11 公共
drwxr-xr-x. 2 0    0 4096 610 22:11 模板
drwxr-xr-x. 2 0    0 4096 610 22:11 视频
drwxr-xr-x. 2 0    0 4096 610 22:11 图片
drwxr-xr-x. 2 0    0 4096 610 22:11 文档
drwxr-xr-x. 2 0    0 4096 610 22:11 下载
drwxr-xr-x. 2 0    0 4096 610 22:11 音乐
drwxr-xr-x. 2 0    0 4096 610 22:11 桌面

3.1.2 cat命令:连接显示文件内容

cat命令也是Linux系统中最常见使用的命令之一。cat命令让我们可以查看文件的内容、连接文件、创建一个或多个文件和重定向输出到终端或文件。
cat命令的语法如下所示:

$ cat [OPTION] [FILE]...

使用cat命令查看文件/etc/group的内容:

[root@hadoop100 ~]# cat /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
....

显示多个文件内容:

[root@hadoop100 etc]# cat /etc/hosts /etc/hostname
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.203.129 hadoop100
hadoop100

使用-n选项,可以显示文件内容的行号:

[root@hadoop100 etc]# cat -n /etc/hosts
     1  127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
     2  ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
     3  192.168.203.129 hadoop100

-b选项和-n选项类似,但只标识非空白行的行号。

使用-e选项,将每一行的结尾显示"$"字符。这个选项在需要将多行内容转换成一行时是很有用的。

[root@hadoop100 etc]# cat -e /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4$
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6$
192.168.203.129 hadoop100$

cat命令可以重定向标准输出到一个新文件。

3.1.3 less、more命令:分屏显示文件

more命令在使用小的xterm窗口时,或是想不适用文本编辑器而只是简单地阅读一个文件时是很有用的。more命令是一个用于一次翻阅一整屏文件的过滤器。
使用more命令查看一个文件:

[root@hadoop100 etc]# more /etc/inittab
# inittab is no longer used when using systemd.
#
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
#
# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
#
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
#
# To view current default target, run:
# systemctl get-default
#
# To set a default target, run:
# systemctl set-default TARGET.target
#

more会自动地清空屏幕并显示文件的开始部分,如果按空格键,more将会向下移动一个当前终端窗口的高度,来显示下一页内容。

使用-num(num是一个整数)选项,可以指定一次显示的行数:

[root@hadoop100 etc]# more -5 /etc/services
# /etc/services:
# $Id: services,v 1.55 2013/04/14 ovasik Exp $
#
# Network services, Internet style
# IANA services version: last updated 2013-04-10
--More--(0%)

也可以通过管道流将cat命令显示的内容输出到more命令。比如有时想输出一个文件的全部内容,但是要慢慢地查看它:

cat README | more
[root@hadoop100 etc]# cat /etc/services | more
# /etc/services:
# $Id: services,v 1.55 2013/04/14 ovasik Exp $
#
# Network services, Internet style
# IANA services version: last updated 2013-04-10
#
# Note that it is presently the policy of IANA to assign a single well-known
# port number for both TCP and UDP; hence, most entries here have two entries
# even if the protocol doesn't support UDP operations.
# Updated from RFC 1700, ``Assigned Numbers'' (October 1994).  Not all ports
# are included, only the more common ones.
#
# The latest IANA port assignments can be gotten from
#       [http://www.iana.org/assignments/port-numbers](http://www.iana.org/assignments/port-numbers)
# The Well Known Ports are those from 0 through 1023.
# The Registered Ports are those from 1024 through 49151
# The Dynamic and/or Private Ports are those from 49152 through 65535
#
# Each line describes one service, and is of the form:
#
# service-name  port/protocol  [aliases ...]   [# comment]

tcpmux          1/tcp                           # TCP port service multiplexer
tcpmux          1/udp                           # TCP port service multiplexer
rje             5/tcp                           # Remote Job Entry
rje             5/udp                           # Remote Job Entry
echo            7/tcp
echo            7/udp
discard         9/tcp           sink null
discard         9/udp           sink null
systat          11/tcp          users
systat          11/udp          users
daytime         13/tcp
daytime         13/udp
qotd            17/tcp          quote
qotd            17/udp          quote
msp             18/tcp                          # message send protocol (historic)
--More--

less命令与more命令类似,但less命令先前和先后翻页都支持,而且less命令不需要在查看前加载整个文件,即less命令查看文件更快速。使用 less命令打开一个文件后,可以使用搜索功能,搜索指定的关键字。

3.1.4 head命令:显示文件头部

head命令用于打印指定输入的开头部分内容。默认情况下,打印每个指定输入的前10行内容。
使用-n选项可以指定打印文件的前N行,如下所示:

[root@hadoop100 etc]# head -n 5 /etc/inittab
# inittab is no longer used when using systemd.
#
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target

也可以直接输入数字:

[root@hadoop100 etc]# head -5 /etc/inittab
# inittab is no longer used when using systemd.
#
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target

使用-c选项打印文件的前N个字节的数据,类似如下:

# inittab [root@hadoop100 etc]# head -c 10 /etc/services
# /etc/ser

3.1.5 tail命令:显示文件尾部

tail命令与head命令相反,它打印指定输入的结尾部分的内容。默认情况下它打印指定输入的最后10行内容。

使用-n选项可以指定打印文件的最后N行,如下所示:

[root@hadoop100 etc]# tail -n  10 /etc/services
3gpp-cbsp       48049/tcp               # 3GPP Cell Broadcast Service Protocol
isnetserv       48128/tcp               # Image Systems Network Services
isnetserv       48128/udp               # Image Systems Network Services
blp5            48129/tcp               # Bloomberg locator
blp5            48129/udp               # Bloomberg locator
com-bardac-dw   48556/tcp               # com-bardac-dw
com-bardac-dw   48556/udp               # com-bardac-dw
iqobject        48619/tcp               # iqobject
iqobject        48619/udp               # iqobject
matahari        49000/tcp               # Matahari Broker

使用-f选项可以即使打印文件中新写入的行:

tail -f /var/log/messages

注意:使用这个选项对于监控日志文件是非常有用的。
–pid选项和-f选项同时使用,可以在特定的进程结束时终结tail命令,命令类似如下:

$ tail -f /tmp/debug.log --pid=24184

3.1.6 file命令:查看文件类型

file命令用于接收一个文件作为参数并执行某些测试,以确定正确的文件类型。下面时使用file命令确定一个文件类型的基本方法:

[root@hadoop100 ~]# file /etc/inittab
/etc/inittab: ASCII text
[root@hadoop100 ~]# file /etc/inid.d/network
/etc/inid.d/network: cannot open (No such file or directory)
[root@hadoop100 ~]# file /usr/bin/file
/usr/bin/file: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=58f6c*****70887d7136a7181************, stripped
[root@hadoop100 ~]# file /etc
/etc: directory

使用-i选项,可以MIME类型的格式显示文件类型的信息:

[root@hadoop100 ~]# file -i /etc/inittab
/etc/inittab: text/plain; charset=us-ascii

[root@hadoop100 ~]# file -i /etc/init.d/network
/etc/init.d/network: text/x-shellscript; charset=us-ascii

[root@hadoop100 ~]# file -i /usr/bin/file
/usr/bin/file: application/x-executable; charset=binary

使用-N选项,输出的队列可以以在文件名之后无空白填充的形式显示,其格式对比如下:

[root@hadoop100 ~]# file -N *
anaconda-ks.cfg: ASCII text
file: empty
initial-setup-ks.cfg: ASCII text
itheima: directory
公共: directory
模板: directory
视频: directory
图片: directory
文档: directory
下载: directory
音乐: directory
桌面: directory

# 区别:
[root@hadoop100 ~]# file *
anaconda-ks.cfg:      ASCII text
file:                 empty
initial-setup-ks.cfg: ASCII text
itheima:              directory
公共:                 directory
模板:                 directory
视频:                 directory
图片:                 directory
文档:                 directory
下载:                 directory
音乐:                 directory
桌面:                 directory

3.1.7 wc命令:查看文件统计信息

wc用于查看文件的行数、单词数和字符数等信息。其语法类似如下所示:

$ wc filename
X Y Z filename

示例:

[root@hadoop100 ~]# wc anaconda-ks.cfg
67  159 1685 anaconda-ks.cfg

使用-l选项,可以只统计文件的行数信息,如下所示:

[root@hadoop100 ~]# wc -l anaconda-ks.cfg
67 anaconda-ks.cfg

使用-w选项,可以只统计文件的单词数信息,如下所示:

[root@hadoop100 ~]# wc -w anaconda-ks.cfg
159 anaconda-ks.cfg

使用-c选项,可以只统计文件的字节数信息,如下所示:

[root@hadoop100 ~]# wc -c anaconda-ks.cfg
1685 anaconda-ks.cfg

使用-L选项,可以统计文件中最长的行的长度,如下所示:

[root@hadoop100 ~]# wc -L anaconda-ks.cfg
125 anaconda-ks.cfg

3.1.8 find命令:查找文件或目录

find命令是Linux系统中最重要也是最常用的命令之一。find命令用于根据指定的参数搜索和定位文件和目录的列表。find命令可以在多种情况下使用,可以通过权限、用户、用户组、文件类型、日期、大小和其他可能的条件来查找文件。
简单的使用find命令查找指定目录下的某个文件的方法如下所示:

[root@hadoop100 ~]# find /etc/ -name inittab
/etc/inittab

注意:此处的命令行提示符是"#"号,表示当前用户账号是root。
在当前目录下,根据文件名查找:

$ find . -name filename

当前目录下,文件名不区分大小写查找:

$ find . -name filename

当前目录下,根据目录名查找:

$ find . -type d -name filename
-type c
              文件是 c 类型的。类型可取值如下:
              b      特殊块文件(缓冲的)
              c      特殊字符文件(不缓冲)
              d      目录
              p      命名管道 (FIFO)
              f      普通文件
              l      符号链接
              s      套接字
              D      门 (Solaris 特有)

当前目录下,根据文件权限查找:

$ find . -type f -perm mode
       -perm mode
              文件的权限位恰好是 mode (八进制或符号)。 Symbolic modes use mode  0  as  a  point  of
              departure.
       -perm -mode
              所有的权限位 mode 都被设置了的文件。
       -perm +mode
              任何权限位 mode 被设置了的文件。

3.2 操作文件和目录

3.2.1 touch命令:创建文件

在Linux中,每个文件都关联一个时间戳,并且每个文件都会存储最近一次访问的时间、最近一次修改的时间和最近一次变更的时间等信息。所以,无论何时我们创建一个新文件,访问或修改一个已存在的文件,文件的时间戳都会自动更新。
touch命令就可用于创建、变更和修改文件的时间戳。它是Linux操作系统的标准程序。touch命令有如下选项:

  • -a:只修改访问时间;
  • -c:不创建任何文件;
  • -m:只改变修改时间;
  • -r:使用指定文件的时间替代当前时间;
  • -t:使用[[CC]YY]MMDDhhmm[.ss]替代当前时间。

使用touch命令创建一个的名称为effyl的新的空文件(0字节):

$ touch effyl

使用touch命令可以创建多个文件,示例如下:

touch sheffyl myeffyl lurffyl

3.2.2 mkdir命令:创建目录

mkdir命令用于创建一个新目录。最基本的mkdir命令的使用方法如下所示:

$ mkdir 

可以使用相对或绝对路径来创建,示例如下:

$ mkdir /home/backup/old

使用-p选项,mkdir命令会自动创建所有还不存在的父目录,示例如下:

$ mkdir -p backup/old
# 或者
$ mkdir -p /home/li/backup/old

要创建的目录已经存在的情况下,会引发错误信息。例如要创建的文件夹backup已经存在,系统会显示错误信息:

[root@hadoop100 ~]# mkdir backup
mkdir: 无法创建目录"backup": 文件已存在

使用-p后,不会报错:

[root@hadoop100 ~]# mkdir -p backup

使用-m选项,可以设置将要创建的目录的权限。例如:想要创建一个任何人都有读写访问权限的目录:

$ mkdir -p -m 777 backup/old
# 或
$ mkdir -p -m a=rwx backup/old

3.2.3 cp命令:复制文件或目录

在Linux下,我们可以使用cp命令复制文件和目录。cp命令用于将文件从一个地方复制到另一个地方。原来的文件保持不变,新文件可能保持原名或用一个不同的名字。
使用cp命令复制文件和目录的语法有以下几种:

$ cp [OPTION] SOURCE DEST # 复制源文件到目标文件
$ cp [OPTION] SOURCE... DIRECTORY # 复制一个或多个源文件到一个目录
$ cp [OPTION] -t DIRECTORY SOURCE... # 同上

创建一个test目录,进入目录后创建file.txt文件,再复制file.txt文件的副本取命为newfile.txt。代码如下:

[root@hadoop100 ~]# mkdir test
[root@hadoop100 ~]# cd test
[root@hadoop100 test]# touch file.txt
[root@hadoop100 test]# cp file.txt newfile.txt
[root@hadoop100 test]# ls
file.txt  newfile.txt

复制当前目录下的文件file.txt到/root/tmp目录下:

[root@hadoop100 test]# cp file.txt /root/tmp/

复制当前目录下的所有文件到/root/tmp目录:

[root@hadoop100 test]# cp * /root/tmp

使用-p选项,可以使复制一个文件到新文件时,保留源文件的所有者、用户组、权限、修改和访问时间,以及一些扩展属性等信息:

[root@hadoop100 test]# cp -p file.txt /root/tmp/

使用-R或-r选项,可以递归地复制一个目录,即将一个目录及其下的所有文件和子目录都复制到另一个目录。

$ cp -R * /home/li/backup

还有比较常用的归档模式复制;

$ cp -a * /home/li/backup
  • -a:存档模式。相当于-dpR。
  • -d:保留软链接。
  • -p:保留权限、所有权和时间戳等信息。
  • -R:递归地复制目录。

3.2.4 ln命令:链接文件或目录

ln命令用于创建软链接或硬链接。ls -l命令列出的每一条目的第一个字符指示文件类型,当一个字符"l"(小写的L)时,即表示它是一个软链接。

  • 软链接又称符号链接,是一类特殊的文件,这个文件包含了另一个文件或目录的路径名(绝对路径或相对路径)。在对符号文件进程读或写操作时,系统会自动把该操作转换为对源文件或目录的操作,但输出链接文件时,系统仅仅删除链接文件,而不删除源文件或目录本身。软链接可以链接不同文件系统的文件。
  • 硬链接可以理解为一文件的一个或多个文件名。它引用的是文件在文件系统中的物理索引(也称为inode)。当你移动或删除原始文件时,硬链接不会被破坏,因为它所引用的是文件的物理数据而不是文件在文件结构中的位置。硬链接的文件不需要用户有访问原始文件权限,也不会显示原始文件的位置,这样有助于文件的安全。如果删除的文件有相应的硬链接,那么这个文件依然会被保留,直到所有对它的引用都被删除,即硬链接数为0。硬链接只能链接同一文件系统中的文件。

使用-s选项,可以创建一个软链接:

[root@hadoop100 test]# ln -s file.txt ../tmp/

创建软链接时,如果已经存在一个与此软链接同名的文件,那么可以使用–backup选项,让ln命令猜创建这个新连结之前,先备份已经存在的同名文件:

[root@hadoop100 test]# ln file.txt sfile.txt
ln: 无法创建硬链接"sfile.txt": 文件已存在 # 已经存在时,会提示错误信息
[root@hadoop100 test]# ln --backup file.txt sfile.txt

当前目录下,创建文件file.txt的硬链接,命名为hfile.txt。两个文件的inode编码应该相同:

[root@hadoop100 test]# ln file.txt hfile.txt
[root@hadoop100 test]# ls -i
1966391 file.txt  1966391 hfile.txt  1966402 newfile.txt

注意:Linux不允许给目录创建硬链接。

3.2.5 mv命令:重命名文件或目录

mv命令用于将文件和目录从一个位置移到另一个位置。除了移动文件,mv命令还可用于修改文件或目录的名字。
mv命令的基本语法如下所示:

$ mv SOURCE... DIRECTORY

将目录中的file.txt移动到tmp目录中:

[root@hadoop100 test]# mv file.txt ../tmp/

也可以同时移动多个文件:

[root@hadoop100 tmp]# mv file.txt namefile.txt ../test/

使用mv将当前目录下的文件改名:

[root@hadoop100 tmp]# mv newfile.txt oldfile.txt
[root@hadoop100 tmp]# ll
总用量 0
-rw-r--r--. 2 root root 0 819 16:54 oldfile.txt

默认情况下,如果目标文件或目录已存在,mv命令并不会提示任何信息,而是直接将其重写覆盖。为了避免这个问题,可以使用-i选项,让mv命令在重写覆盖目标文件或目录之前给出提示信息。这样可以通过输入字符"y"或"n"来接收或拒绝此操作。
使用mv命令也可以同时移动多个文件或目录。比如想移动当前目录下的所有文件可以使用"*"。

3.2.6 rm命令:删除文件或目录

rm命令用于删除指定的文件和目录。其语法如下所示:

$ rm [OPTION] ... FILE ...

使用rm命令删除文件file1.txt、file2.txt、file3.txt,假设这三个在当前目录下:

[root@hadoop100 tmp]# rm file1.txt file2.txt file3.txt
rm:是否删除普通空文件 "file1.txt"?y
rm:是否删除普通空文件 "file2.txt"?y
rm:是否删除普通空文件 "file3.txt"?y

使用-i选项,可以让rm命令在删除每一个文件和目录前提示用户确认:

[root@hadoop100 tmp]# rm -i file1.txt file2.txt file3.txt
rm:是否删除普通空文件 "file1.txt"?y
rm:是否删除普通空文件 "file2.txt"?y
rm:是否删除普通空文件 "file3.txt"?y

使用-f选项,删除前不提示用户确认,并忽略不存在的文件。
使用-r(或-R)选项,递归地删除目录及其下的内容。

3.3 管理文件或目录权限

3.3.1 ls -l:显示文件和目录权限

使用ls -l命令可以按长列表方式输出文件的详细信息,其中第一个字符表示文件的类型(目录、文件或链接),从第2~10这9个字符即指示文件的3种用户类型的权限。

[root@hadoop100 test]# ls -l
总用量 0
-rw-r--r--. 4 root root 0 819 16:54 file.txt
-rw-r--r--. 4 root root 0 819 16:54 hfile.txt
-rw-r--r--. 1 root root 0 819 20:56 namefile.txt
-rw-r--r--. 2 root root 0 819 16:54 newfile.txt
-rw-r--r--. 4 root root 0 819 16:54 sfile.txt
-rw-r--r--. 4 root root 0 819 16:54 sfile.txt~

每个文件或目录都有3个用户权限组:

  • 所有者权限:第一组的3个字符rw-,表示只应用于文件或目录的所有者,它们将不影响其他用户行为。
  • 用户组权限:第二组的3个字符r–,表示只应用于已经指定给文件或目录的组,它们将同样不影响其他用户的行为。
  • 其他用户权限:第三组的三个字符r–,表示只应用于系统中的所有其他用户。

每个文件或目录华友三个基本的权限类型:

  • r:读权限。指用户的读文件内容或列出目录内容的权限。
  • w:写权限。指用户的写或修改文件或目录的权限。
  • x:执行权限。指用户执行文件或进入目录的权限。

3.3.2 chmod命令:修改权限

chmod命令用于修改文件或目录的权限。chmod命令根据相应的模式修改每个给定文件的权限。这里的模式有两种:一种是符号表达式模式,另一种是八进制位模式。
使用符号表达式模式的格式如下所示:

$ chmod [OPTION] ...[ugoa] [ [+-=] , [rwxug] ] [,...] FILE...

字母"ugoa"的组合控制哪些用户对文件的访问权限将被改变。

  • u:指文件或目录的所有者。
  • g:指文件或目录的用户组的成员。
  • o:指不在文件或目录的用户组中的其他用户。
  • a:指所有用户,即(ugo)。

注意:如果使用chmod命令的符号表达式模式时,不给出"ugoa"的组合。则得到的结果和使用"a"相同。
操作符"±="表示权限的授予或撤销。

  • +:选定的权限将被添加。
  • -:选定的权限将被移除。
  • =:文件只拥有选定的权限。

示例:
赋予所有人对文件读、写和执行的权限:

chmod a+rwx file.txt

chmod命令的数字模式使用数字来表示读(4)、写(2)和执行(1)的权限,而每个用户权限组的值就是表示读、写和执行权限的这3个数字(4,2,1)组合的相加得到的八进制数(0~7)。各数字所表示的权限如下表所示:

数值 说明
4 r读权限
2 w写权限
1 x执行权限
4+2+4=7 rwx读写执行权限
4+2+0=6 rw读写权限
2+1=3 wx写执行权限
4+1=5 rx读执行权限

赋予所有人对文件的读、写和执行权限:

[root@hadoop100 test]# chmod 777 namefile.txt
[root@hadoop100 test]# ll
总用量 0
-rwxrwxrwx. 4 root root 0 819 16:54 file.txt
-rwxrwxrwx. 4 root root 0 819 16:54 hfile.txt
-rwxrwxrwx. 1 root root 0 819 20:56 namefile.txt
-rw-r--r--. 2 root root 0 819 16:54 newfile.txt
-rwxrwxrwx. 4 root root 0 819 16:54 sfile.txt
-rwxrwxrwx. 4 root root 0 819 16:54 sfile.txt~

使用-R选项,chmod命令可以递归地修改目录的权限。

3.3.3 chown、chgrp命令:修改文件所有者和用户组

chown命令用于修改文件或目录的所有者和用户组信息。其语法如下所示:

$ chown [OPTION]... [OWER] [:[GROUP]] FILE

例如,将文件file.txt的所有者改为li:

[root@hadoop100 test]# chown li file.txt
[root@hadoop100 test]# ll
总用量 0
-rwxrwxrwx. 4 li   root 0 819 16:54 file.txt
-rwxrwxrwx. 4 li   root 0 819 16:54 hfile.txt
-rwxrwxrwx. 1 root root 0 819 20:56 namefile.txt
-rw-r--r--. 2 root root 0 819 16:54 newfile.txt
-rwxrwxrwx. 4 li   root 0 819 16:54 sfile.txt
-rwxrwxrwx. 4 li   root 0 819 16:54 sfile.txt~

将文件file.txt的用户组也修改为li:

[root@hadoop100 test]# chown :li file.txt
[root@hadoop100 test]# ll
总用量 0
-rwxrwxrwx. 4 li   li   0 819 16:54 file.txt
-rwxrwxrwx. 4 li   li   0 819 16:54 hfile.txt
-rwxrwxrwx. 1 root root 0 819 20:56 namefile.txt
-rw-r--r--. 2 root root 0 819 16:54 newfile.txt
-rwxrwxrwx. 4 li   li   0 819 16:54 sfile.txt
-rwxrwxrwx. 4 li   li   0 819 16:54 sfile.txt~

同时修改所有者和用户组:

[root@hadoop100 test]# chown root:root file.txt
[root@hadoop100 test]# ll
总用量 0
-rwxrwxrwx. 4 root root 0 819 16:54 file.txt
-rwxrwxrwx. 4 root root 0 819 16:54 hfile.txt
-rwxrwxrwx. 1 root root 0 819 20:56 namefile.txt
-rw-r--r--. 2 root root 0 819 16:54 newfile.txt
-rwxrwxrwx. 4 root root 0 819 16:54 sfile.txt
-rwxrwxrwx. 4 root root 0 819 16:54 sfile.txt~

修改文件所有者和所有组后,硬链接和软链接文件的所有者和所有组均被修改。

修改软链接文件的所有者和用户组信息:

[root@hadoop100 test]# chown li:li sfile.txt
[root@hadoop100 test]# ll
总用量 0
-rwxrwxrwx. 4 li   li   0 819 16:54 file.txt
-rwxrwxrwx. 4 li   li   0 819 16:54 hfile.txt
-rwxrwxrwx. 1 root root 0 819 20:56 namefile.txt
-rw-r--r--. 2 root root 0 819 16:54 newfile.txt
-rwxrwxrwx. 4 li   li   0 819 16:54 sfile.txt
-rwxrwxrwx. 4 li   li   0 819 16:54 sfile.txt~

注意:默认情况下,当使用chown命令修改软链接文件时,实际修改的是软链接所指向的文件。修改

修改硬链接文件的所有者和所有组信息:

[root@hadoop100 test]# chown root:root hfile.txt
[root@hadoop100 test]# ll
总用量 0
-rwxrwxrwx. 4 root root 0 819 16:54 file.txt
-rwxrwxrwx. 4 root root 0 819 16:54 hfile.txt
-rwxrwxrwx. 1 root root 0 819 20:56 namefile.txt
-rw-r--r--. 2 root root 0 819 16:54 newfile.txt
-rwxrwxrwx. 4 root root 0 819 16:54 sfile.txt
-rwxrwxrwx. 4 root root 0 819 16:54 sfile.txt~

chgrp命令和chown命令类似,但是chgrp命令只用于修改文件或目录的用户组(不能修改所有者)。其语法如下:

$ chgrp [OPTION]... GROUP FILE...

3.3.4 设置setuid和setgif权限位:设置用户和组权限位

setuid(设置用户标识)是允许用户以文件所有者的权限执行一个程序的权限位。
setgig(设置组标识)是允许用户以用户组成员的权限执行一个程序的权限位。
可以使用chown命令设置setuid和setgid权限位。

3.4 文本处理

3.4.1 sort命令:文本排序

sort命令用于将文本文件的行排序。默认情况下,sort命令是按照字符串的字母顺序排序。现有一个包含如下内容的文件:

[root@hadoop100 test]# cat file.txt
abc
def
ghi
jkl
mno
def

不使用任何选项,sort命令可以简单地将文件内容按字母顺序进行排序:

[root@hadoop100 test]# sort file.txt
abc
def
def
ghi
jkl
mno

使用-u选项,sort命令可以移除所有重复的行:

[root@hadoop100 test]# sort -u file.txt
abc
def
ghi
jkl
mno

使用-n选项,可以使用sort命令将数字按数值的大小排序:

[root@hadoop100 test]# cat numfile.txt # 原始文件
20
10
35
100
69
83
[root@hadoop100 test]# sort numfile.txt # 使用sort排序并不能按照大小排序
10
100
20
35
69
83
[root@hadoop100 test]# sort -n numfile.txt # 使用-n选项排序
10
20
35
69
83
100

使用-r选项,可以是sort命令以倒序方式排序:

[root@hadoop100 test]# sort -nr numfile.txt
100
83
69
35
20
10

sort命令可以同时将多个文件的内容排序:

$ sort file1 file2

如果一个文件有多个列,(每列以逗号","分隔)如下所示:

[root@hadoop100 test]# cat lettfile.txt
abc,20
def,10
ghi,35
jkl,100
mno,69
def,83

默认情况下,sort命令按文件第一列字符串字母顺序将文件内容排序:

[root@hadoop100 test]# sort lettfile.txt
abc,20
def,10
def,83
ghi,35
jkl,100
mno,69

指定sort命令按照第二列的字符串顺序将文件内容排序:

[root@hadoop100 test]# sort -t ',' -k2,2 lettfile.txt
def,10
jkl,100
abc,20
ghi,35
mno,69
def,83

使用-t选项用于指定列的分隔符,上例中的分隔符是逗号",";-k选项用于指定进行排序的列 -k POS1[,POS2]
,这里指定了第二列。
指定sort命令按照第二列的数值顺序将文件内容排序:

[root@hadoop100 test]# sort -t ',' -k2n,2 lettfile.txt
def,10
abc,20
ghi,35
mno,69
def,83
jkl,100

指定sort命令按照第二列的数值倒序将文件内容排序:

[root@hadoop100 test]# sort -t ',' -k2nr,2 lettfile.txt
jkl,100
def,83
mno,69
ghi,35
abc,20
def,1

3.4.2 uniq命令:文本去重

uniq命令用于移除或发现文件中重复的条目:
现有一个文件,其内容形式如下:

[root@hadoop100 test]# cat letter.txt
aaa
aaa
bbb
bbb
ccc
ccc
ccc

使用uniq命令,不带任何选项时,它将移除文件中重复的行并显示单一行:

[root@hadoop100 test]# uniq letter.txt
aaa
bbb
ccc

使用-c选项,可以统计重复行出现的次数:

[root@hadoop100 test]# uniq -c letter.txt
2 aaa
2 bbb
3 ccc

使用-d选项,只显示文件中有重复的行并且只显示一次:

[root@hadoop100 test]# uniq -d letter.txt
aaa
bbb
ccc

使用-u选项,只显示文件中不重复的行

使用-w选项,可以限制uniq命令只比较每行的前N个字符。

使用-s选项,可以避免uniq命令比较每行的前N个字符,

使用-f选项,可以避免uniq命令比较前N列,即跳过前N列,只比较后面的字符。

3.4.3 tr命令:替换或删除字符

tr命令用于转换字符、删除字符和压缩重复的字符。它从标准输入读取数据并将结果输出到标准输出。语法如下所示:

$ tr [OPTION]... SET1 [SET2]

3.4.4 grep命令:查找字符串

grep命令用于搜索文本或指定的文件中与指定的字符串或模式相匹配的行。默认情况下,grep命令只显示匹配的行。语法如下所示:

$ grep [OPTION]... PATTERN [FILE] ...
$ grep [OPTION]... [-e PATTERN | -f FILE] [FILE]...

使用grep命令查找文件/etc/passwd中账号root的信息:

[root@hadoop100 ~]# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

使用-i选项,可以强制grep命令忽略搜索关键字的大小写:

[root@hadoop100 ~]# grep -i root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

使用-r选项,可以递归搜索指定目录下的所有文件:

[root@hadoop100 ~]# grep -r root /etc/
# 或者
[root@hadoop100 ~]# grep -R root /etc/

将-r选项与-l选项结合使用,grep命令可以只打印输出包含匹配指定模式的行的文件的名字:

[root@hadoop100 ~]# grep -rl root /etc/
/etc/rsyncd.conf
/etc/dnsmasq.conf
/etc/rpm/macros.jpackage
/etc/rpm/macros.fjava
/etc/rpm/macros.perl
/etc/lsm/lsmd.conf

默认情况下,当搜索字符串root时,grep命令也会匹配root122、rootegn等字符串。使用-w选项,可以强制grep命令只匹配包含指定单词的行。比如查找文件/etc/passwd中只包含指定单词li的行:

[root@hadoop100 ~]# grep -w li /etc/passwd
li:x:1000:1000:li:/home/li:/bin/bash

使用-c选项,grep命令可以报告文件或文本中模式被匹配的次数:

[root@hadoop100 ~]# grep -c li /etc/passwd
10

使用-n选项,grep命令可以显示每一个匹配的行的行号:

[root@hadoop100 ~]# grep -n li /etc/passwd
17:libstoragemgmt:x:998:995:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
18:colord:x:997:994:User for colord:/var/lib/colord:/sbin/nologin
19:rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
24:setroubleshoot:x:993:990::/var/lib/setroubleshoot:/sbin/nologin
28:chrony:x:992:987::/var/lib/chrony:/sbin/nologin
34:geoclue:x:989:983:User for geoclue:/var/lib/geoclue:/sbin/nologin
36:gdm:x:42:42::/var/lib/gdm:/sbin/nologin
37:rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
38:nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
44:li:x:1000:1000:li:/home/li:/bin/bash

使用-v选项,grep命令可以输出除匹配指定模式的行以外的其他所有行:

[root@hadoop100 ~]# grep -v li /etc/passwd

grep命令通常与Shell管道一起结合使用:

[root@hadoop100 ~]# grep -n li /etc/passwd

3.4.5 diff命令:比较两个文件

diff命令用于比较两个文件,并找出它们之间的不同。语法如下所示:

$ diff [OPTION]... from-file  to-file

3.5 其他常用命令

3.5.1 hostname命令:查看主机名

hostname命令用于查看系统的主机名,或是修改系统的主机名。
直接简单地使用hostname命令,不指定任何参数,将显示你的系统的当前主机名:

[root@hadoop100 ~]# hostname
hadoop100

使用houstname可以修改主机名,但是只是临时地修改系统的主机名。当系统重启后,这个新修改的主机名将不会被使用。
使用-F选项,hostname命令可以从指定的文件中读取主机名。

3.5.2 w、who命令:列出系统登录的用户

w命令用于显示登录的用户及他们当前运行的进程。
w命令输入的内容格式如下:

$ w

示例:

[root@hadoop100 ~]# w
 22:27:27 up 26 min,  1 user,  load average: 0.00, 0.01, 0.03
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.203.1    22:01    7.00s  0.08s  0.01s w

w命令输出的第一行内容与uptime命令默认输出的内容相同。第三行分别显示的是:登录账号的用户名、tty名称、从哪台主机登录、登录时间、空闲时间、tty上的所有进程所使用的CPU时间、当前进程所使用的CPU时间以及当前运行的进程。
who命令有与w命令类似的用途,但它的功能比w命令更强大一些。who命令的语法如下:

$ who [OPTION]...[FILE | ARG1 ARG2]

直接使用who命令,不知道任何参数,将显示当前登录的所有用户的信息:

[root@hadoop100 ~]# who
root     pts/0        2022-08-20 22:01 (192.168.203.1)

使用-b选项,who命令可以显示系统的启动时间:

[root@hadoop100 ~]# who -b
系统引导 2022-08-20 22:01

使用-l选项,who命令会显示出系统登录进程:

[root@hadoop100 ~]# who -l

使用-m选项,who命令将只显示与当前标准输入关联的用户信息:

[root@hadoop100 ~]# who -m
root     pts/0        2022-08-20 22:01 (192.168.203.1)

使用-r选项,who命令将显示系统的运行级别:

[root@hadoop100 ~]# who -r
运行级别 5 2022-08-20 22:01

使用-q选项,who命令将只显示所有登录用户的用户名和登录的用户数:

[root@hadoop100 ~]# who -q
root
# 用户数=1

3.5.3 uptime命令:查看系统运行时间

uptime命令用于打印系统的运行时间等信息。
uptime命令的使用很简单,只需要简单地在命令提示符下输入uptime命令,将显示如下信息:

[root@hadoop100 ~]# uptime
 22:38:42 up 37 min,  1 user,  load average: 0.00, 0.01, 0.03
# 当地时间  系统已经连续运行多久 几个用户 系统的过去1分钟、5分钟、15分钟的平均负载

3.5.4 uname命令:查看系统信息

uname命令用于打印内核名称和版本、主机名等系统信息。

$ uname [OPTION]...
[root@hadoop100 ~]# uname
Linux

3.5.5 date命令:显示和设置系统日期和时间

date命令用于多种格式显示日期和时间,或设置系统的日期和时间。
date命令的语法如下:

$ date [OPTION]...[+FORMAT]
$ date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
[root@hadoop100 ~]# date
2022年 08月 20日 星期六 22:57:38 CST

3.5.6 id命令:显示用户属性

id命令用于打印输出用户的uid、gid、用户名和组名等用户身份信息。id命令的语法如下:

$ id [OPTION]...[USERNAME]

直接输入id命令,将打印输出当前用户的uid、用户名、gid、组名,以及用户属于的所有群组信息:

[root@hadoop100 ~]# id
uid=0(root) gid=0(root)=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

你可能感兴趣的