Linux / Mac 下 基本的 bash shell 命令详解
前言
本篇主要介绍了在Linux / Mac 系统下,一些基本的bash shell命令。
遍历目录 cd
cd destination
cd命令可以带单个参数destination,用以制定你想切换到的目录名。如果用户没有指定目标路径,将会切换到当前用户主目录。
目录路径参数可以使用两种方式表达:
绝对文件路径
用户可在虚拟目录中采用==绝对文件路径==来引用目录名。绝对文件路径定义了在虚拟目录结构中该目录的确切位置,以虚拟目录的根目录开始,相当于目录的全名。
即以“/”开头的目录的绝对路径,当当前所在的目录已经在工作目录中时,可以使用 cd / 回到根目录。
相对文件路径
==相对文件路径==允许用户指定一个基于当前位置的目录文件路径,而无需再从根目录开始。相对文件路径不以代表根目录的正斜线(/)开头,而以目录名(如果用户准备切换到当前工作目录下的一个目录)或是一个表示基于用户当前目录的相对位置的特殊字符开始。有两个特殊字符:
单点符(.),表示当前目录;
双点符(..),表示当前目录的父级目录。
例如:
cd ../Desktop
cd ./Doc
cd ../../etc
列表命令 ls
基本列表功能
命令区分大小写。
ls命令的基本格式会显示当前目录下的文件和目录。
ls命令输出的列表是按字母排序的(按列排序而不是按行排序)。如果用户用的是支持彩色的终端模拟器(==Mac 电脑终端默认是没有色彩的,可以百度添加配置文件==),ls命令还可以用不同的颜色来区分不同类型的文件。LS_COLORS环境变量控制着这个功能。
ls -F:该命令会在结果中的目录名后面加正斜线(/),以方便用户在输出中分辨它们。类似的,他会在可执行文件后面加个星号,以便找出可在系统上运行的文件。
ls -a:该命令可以将隐藏文件和目录一起显示出来。
ls -R:该命令可以列出当前目录下的包含的目录中的文件。如果有很多个目录,这个输出会很长。
修改输出信息
ls命令并没有输出每个文件额太多相关信息。需要显示更多的信息,需要使用改命令:
ls -l:该参数会产生长列表格式的输出,包含了目录中每个文件的更多的相关信息:
这种超列表格式的输出在每一行中列出了单个文件或目录。除了文件名,输出中还有其他有用信息。输出的第一行显示了目录中包含的块的总数。之后每一行都包含了关于文件(或目录)的下述信息:
文件类型,比如目录(d)、文件(-)、字符型文件(c)或者块文件(b);
文件的权限;
文件的硬链接总数;
文件属主的用户名;
文件属主的组名;
文件的大小(已字节为单位);
文件的上次修改时间;
文件名或目录名。
完整的参数列表
在进行文件管理时,ls命令的很多参数可能会派上用场。针对ls运行一下man命令,你就能看到可用来修改ls命令输出的参数就有好几页。man ls
ls命令采用两种格式的命令行参数:
单字母参数;
全字母参数;
单字母参数通常是由英文破折号开始,全字参数则更易于看懂,通常以双英文破折号开始。许多参数都有单字母和全字母两种版本,而有些则只有一种。
==Mac 终端下,测试了几个命令并不用输入“–”,直接输入“-”加后面的命令即可,还有就是下表的一些命令,在Mac 并没有响应。目前不知道是测试输入错误还是本身并不支持。==
单字母全字描述
-a
–all
输出包括以“.”打头的隐藏文件
-A
–almost-all
不要输出“.”和“..”文件
–author
输出每个文件的作者
-b
–escape
输出不可打印的字符的八进制值
–block-size=size
按照size字节的大小来计算大小块(快数)
-B
–ignore-backups
不要列出名称中包含波浪线(~)的条目(波浪线用来表示备份的副本)
-c
按最后一次修改时间排序
-C
按列输出条目
–color=when
何时使用彩色(always,never或者auto)
-d
–directory
列出目录条目而非内容,并且不用跟踪符号链接
-F
–classify
给条目追加文件类型标识符
–file-type
只在部分文件类型(非可执行文件)后追加文件类型标识符
–format=word
将输出格式化成across(交叉)、commas(逗号)。horizontal(水平)、long(长)、single-column(单列)、verbose(详细)或vertical(垂直)
-g
输出除文件属主之外所有信息
–group-directories-first
在文件之前列出所有目录
-G
–no-group
在长列表输出格式下,不显示组名
-h
–human-readable
打印大小,K表示千字节
–si
和-h相同,但进率为1000,而非1024
-i
–inode
显示每个文件的所有值(inode)
-l
按长列表输出格式显示
-L
–dereference
对于链接文件,显示原文件信息
-n
–numeric-uid-gid
显示数字类型的userid和groupid以替代名字
-o
在长列表格式下不显示组名
-r
–reverse
在输出文件和目录时,反转排序的顺序
-R
–recursive
递归的列出子目录的内容
-s
–size
输出每个文件的块大小
-S
–sort=size
按文件大小排序输出
-t
–sort=time
按文件修改时间排序输出
-u
输出文件的最后访问时间而非最后修改时间
-U
–sort=none
不要将输出排序
-v
–sort=version
将文件版本排序输出
-x
按行而非按列输出条目
-X
–sort=extension
按文件扩展名排序输出
如果需要,也可以一次使用多个参数。多个双破折线参数必须分开输入,而多个单波折线可以组合成一个字符串跟在一个单破折线后面。例如:ls -alis 。单命令无关顺序。
过滤输出列表
由前面的例子可以知道,默认情况下,ls命令会输出目录下的所有文件。
ls命令还支持在命令行下定义过滤器。它会用过滤器决定应该在输出中显示哪些文件和目录。
这个过滤器就是个进行简单文本匹配的的字符串,可以在要用的命令行参数后添加这个过滤器:
ls -l 匹配字符串
当用户指定特定的文件名称作为过滤器时,ls命令只会显示那个文件的信息。
有时候当不知道要找的文件的确切名称。ls命令可以识别标准通配符,并在过滤器中用它们来进行模式匹配:
问好代表一个字符。
星号代表零个或多个字符。
问号可用在过滤器字符串中替代任意位置的单个字符。
例如:
ls -l mypro?
ls -l mypro*
处理文件
bash shell 提供了很多在Linux文件系统上操作文件的命令。
创建文件 touch
可以使用touch命令来轻松创建空文件:
touch test
touch命令创建了指定的新文件,并将当前用户名作为文件的属主。
创建的文件大小是零,touch命令只会创建一个空文件。
如果再次使用:touch test命令,当前已经存在test文件,该命令行会使已有文件的访问时间和修改时间进行改变,而不改变文件的内容。
touch -a :只修改访问时间;
touch -m :只改变修改时间;
默认情况下,touch使用当前时间,可以使用:
touch -t 参数加上特定的时间戳来制定时间
例如:
touch -t 201612251200 test
复制文件 cp
在文件系统中将文件和目录从一个位置复制到另一个位置就需要使用cp命令。
最基本用法里,cp需要两个参数,源对象和目标对象:
cp source destination
当source的destination参数都是文件名时,cp命令将源代码复制到一个新文件,并且以destination命名。新文件就像全新的文件一样,有新的创建时间和修改时间。如果目标文件已经存在了,那么cp命令将会提示你是否要覆盖已有文件。
同大多数命令一样,cp命令也有一些可以提供帮助的命令行参数(当前其中部分命令行在Mac下面并没有效果):
参数描述
-a
归档文件,并保留它们现在的属性(linux文件归档的意思是为文件或目录备份,建立归档文件)
-b
创建已存在目录文件的备份,而非覆盖它
-d
保留
-f
强制覆盖已存在的目标文件,不提示
-i
在覆盖目标文件之前提示
-l
创建文件链接而非复制文件
-p
如果可能保留文件属性
-r
递归的复制文件
-R
递归的复制目录
-s
创建一个符号链接而非复制文件
-S
覆盖默认的备份文件的后缀(默认是~)
-u
仅在源文件比目标文件新的情况下复制(相当于更新)
-v
详细模式,解释到底发生了什么
-x
仅限于当前文件系统的复制(这句话的背景是:Linux可同时挂在多个不同的文件系统类型的存储设备)
链接文件 cp -l cp -s
链接文件下面的两个参数只针对Linux有用,Mac上进过测试没有这几个命令参数。
你可能已经注意到,cp命令的许多参数都是针对链接文件的。这是Linux文件系统的一个优点。
如需要在系统上维护同一文件的的两份或者多份副本,除了保存多份单独的物理文件副本之外。还可以采用保存一份物理文件副本和多个虚拟副本的方法。这种虚拟的副本就被称为链接。链接是目录中指向文件真实位置的占位符。在Linux中有两种不同类型的文件链接:
符号链接,即软链接;
硬链接
硬链接会创建一个独立文件,其中包含了源文件的信息以及位置。引用硬链接文件文件等同于链接了源文件:
cp -l test1 test4
-l参数创建了一个指向test1的硬链接test4。在文件列表可看出,文件test1和test4的索引节点号是相同的,这表明,实际上它们是同一个文件。还要注意,链接计数表示当前这两个文件都有两个链接了。
只能在同种存储媒体上的文件之间创建硬链接,不能在不同挂载点下的文件间创建硬链接。在后一种情况下,可以使用软链接。
-s参数可以创建一个符号链接,即软链接:
cp -s test1 test5
首先,新建的test5文件有了一个不同于test文件的索引节点号,这说明Linux系统把它当做一个单独的文件。
其次,文件变小了。链接文件只需要存储源文件的信息,并不需要存储源文件中的数据。
在复制文件链接时需要注意,如果用cp命令来复制一个链接到到另一个源文件的文件,那么你复制的其实是源文件的另一个副本,而不是链接文件的。这点很容易混淆。可以创建一个指向源文件的新链接,而不用复制链接文件。可以创建指向同一文件的多个链接,但不要创建指向其他符号链接文件的多个符号链接。这样会生成一个链接文件链,不但容易混淆,还容易断掉,造成各种各样的问题。
重命名文件 mv
在Linux中,重命名文件称为移动(moving)。mv命令就是用来将文件和目录移动到另一个位置的:
mv test1 test2
mv test1 ../Desktop/
移动文件会改变文件名,但保持同样的索引节点号和时间戳。移动一个有软链接指向文件会带来麻烦,会造成一个软链接文件指向一个无效文件。
删除文件 rm
在Linux中,删除(deleting)叫做移除(removing)。base shell 中删除文件的命令是rm。
rm test1
注意命令会提示是否真的要删除文件(Mac下不会提示)。
base shell中没有回收站或者垃圾桶,所以一旦删除就无法找回了。
关于rm命令的命令行参数,可以参考cp的命令行参数,大多数是一致的,以下列举几个常用的:
-d:直接把欲删除的目录的硬连接数据删除成0,删除该目录;
-f:强制删除文件或目录;
-i:删除已有文件或目录之前先询问用户;
-r或-R:递归处理,将指定目录下的所有文件与子目录一并处理;
–preserve-root:不对根目录进行递归操作;
-v:显示指令的详细执行过程。
当输出一个带链接的文件时,源文件被删除后,硬链接文件内容依旧存在,而软链接文件时,bash会表示它已经不复存在了。
硬链接文件采用和源文件相同的索引节点号。硬链接会一直维护这个索引节点号来保留数据,知道删除了最后一个链接它的文件。
所有的软链接文件都知道它所指向的文件不存在了,所以指向的也就是一个无效文件。
处理文件
创建目录
在Linux中创建目录使用mkdir命令。
mkdir finder
系统会创建一个新目录,并给它分配一个新的索引节点号。
删除目录
base shell会尽可能的防止用户误删目录。删除目录的基本命令是:rmdir:
rmdir finder
默认情况下,rmdir命令只删除空目录。可以使用--ignore-fail-on-non-empty参数来删除非空目录。
当然rm命令也可以使用,由于删除的是目录,所以一般情况下需要加-r参数,来递归删除目录。
一般用的最多的就是rm -rf,递归强制删除。
查看文件内容
查看文件统计内容 stat
stat 命令可以提供文件系统上某个文件的所有状态信息:
stat test
stat 会显示文件的基本信息,但是不会显示当前文件的类型。
查看文件类型 file
file命令就是用来查看文件类型的命令。
file test
file命令将文件分成3类:
文本文件:可打印字符的文件。
可执行文件:可在系统上运行的文件。
数据文件:包含不可打印的二进制字符、又不能在系统上运行的文件。
当文件是文本文件时,file命令可以判断出该文件包含文本,还判断出文本的字符编码;
当文件是文本脚本文件时,会判断出可以在系统上运行;
当文件是二进制可执行程序时,file命令可以判断出文件编译时面向的平台,以及它需要哪种类型的库。如果你有从未知来源获得的二进制文件,这会是个非常有用的特性。
查看整个文件 cat more less
cat命令
cat命令是显示文本文件中所有数据的得力助手。
cat test
cat -n test :给所有行加上行号;
cat -b test :只给有文本的行加上行号;
cat -s test :将多个空白行压缩到单个空白行;
cat -K test :将制表符使用^I字符组合替换文中所有制表符。
对大型文件来说,cat命令会有点繁琐,文件的文本会在显示器上一晃而过。
more 命令
more命令会显示文本文件的内容,但会在显示每页数据之后停下来,并且在屏幕底部显示一个more标签,并显示现在在文本文件中的位置。
more命令的选项:
选项描述
H
显示帮助菜单
spacebar
显示文本文件的下一屏
z
显示文件文本的下一屏
ENTER
显示文本文件的下一行
d
显示文件文本的后面半屏(会更新11行)
q
退出程序
s
显示文件文本的下一行
f
显示下一屏文件文本
b
显示上一屏文件文本
/expression
在文件中查找匹配文本表达式的内容
n
在文件中查找下一处匹配已制定表达式的内容
‘
跳到指定表达式匹配到的第一处内容
!cmd
执行shell命令
v
在当前行启动vi编辑器
CTRL-L
重绘当前行
=
显示当前行在文件中的行号
.
重复执行前一个命令
more命令只支持文本文件中基本的移动。
less命令
less 命令是more命令的升级版本,提供了一些极为实用的在文本文件中前后翻动的功能,还有一些极先进的搜索功能。
less命令会提供一些额外的信息:显示了文件的总行数以及现在显示的行号区间。less命令支持了more命令支持的所有参数,同事还多了一些选项。
查看部分文件 tail head
tail命令
tail命令会显示文件末尾部分的内容。默认情况下会显示文件的末尾10行。
参数描述
-c bytes
显示文件最后的bytes个字节的字符
-n lines
显示文件最后的lines行
-f
让tail程序一直保持在活动状态,如果有新的内容加到文件的末尾就显示出来
–pid=PID
和参数-f一起,跟踪一个文件知道进程ID为PID的进程结束
-s sec
和-f参数一起,在每次循环输出之间休眠sec秒
-v
总是显示带文件名的头
-q
从不显示带文件名的头
-f参数是tail命令的一个突出特性,它允许你在其他进程使用该文件时查看文件的内容。tail命令会保持活动状态并不断的显示添加到文件中的内容。这是实时监测系统日志的绝妙方式。
head 命令
head命令会显示文件开头那些行的内容。默认情况下,它会显示文件前10行的文本。类似于tail命令,支持-c -n参数,但是不支持-f参数。