【Linux系统】常用命令:基础操作、文件目录
现如今各种场合都有使用各种 Linux 发行版,从嵌入式设备到超级计算机,并且在服务器领域确定了地位,对于一个开发人员来说,Linux的学习是必不可少的,对于简单操作Linux系统更是必备的技能,对于Linux系统的重要性在这里不多赘述。于是我在学习过程中,整理了一系列Linux常用命令,文章内容收集整理于网络,相关代码都是经过自己实现验证的,众所周知,Linux系统的相关命令是数不胜数的,学完以至于完全记住是很难的,在这里只是整理一部分常用、实用、后端开发人员必备的命令,当然,个人感觉这些命令不需要刻意去记忆,而是在反复的使用过程中达到孰能生巧的,所以本系列文章目的主要用于方便自己后期的查阅与复习,希望可以帮助到你!
学习Linux系统,那么常用的命令则是重中之重,尤其是对于后端开发人员来说,是必备技能之一,当然对于运维人员来说只会基本命令是不够的。在学习使用常用命令之前首先了解一下预备知识。
0.预备知识
Shell
Shell
这个单词的原意是“外壳”,跟 kernel
(内核)相对应,比喻内核外面的一层,即用户跟内核交互的对话界面。
Shell
是一个程序,提供一个与用户对话的环境。这个环境只有一个命令提示符,让用户从键盘输入命令,所以又称为命令行环境(command line interface
,简写为CLI
)。Shell
接收到用户输入的命令,将命令送入操作系统执行,并将结果返回给用户。Shell
是一个命令解释器,解释用户输入的命令。它支持变量、条件判断、循环操作等语法,所以用户可以用Shell
命令写出各种小程序,又称为Shell
脚本。这些脚本都通过Shell
的解释执行,而不通过编译。Shell
是一个工具箱,提供了各种小工具,供用户方便地使用操作系统的功能。
Shell
有很多种,只要能给用户提供命令行环境的程序,都可以看作是 Shell
。
历史上,主要的 Shell
有下面这些:
- Bourne Shell(sh)
Bourne Again shell(bash)
- C Shell(csh)
- TENEX C Shell(tcsh)
- Korn shell(ksh)
- Z Shell(zsh)
- Friendly Interactive Shell(fish)
其中 Bash
是目前最常用的 Shell
。 MacOS
中的默认 Shell
就是 Bash
。
通过执行 echo $SHELL
命令可以查看到当前正在使用的 Shell
。还可以通过 cat /etc/shells
查看当前系统安装的所有 Shell
种类。
注意:在Linux中命令严格区分大小写!!!
命令行提示符
进入命令行环境以后,用户会看到 Shell
的提示符。提示符往往是一串前缀,最后以一个美元符号 $
或#
结尾,用户可以在这个符号后面输入各种命令。
执行一个简单的命令 pwd
:
[root@localhost ~]# pwd
/root
命令解析:
root
:表示用户名;localhost
:表示主机名;~
:表示目前所在目录为家目录,其中root
用户的家目录是/root
普通用户的家目录在/home
下;#
:指示你所具有的权限(root
用户为#
,普通用户为$
)。- 执行
whoami
命令可以查看当前用户名; - 执行
hostname
命令可以查看当前主机名;
关于如何创建、切换、删除用户,在后面的用户与权限会具体讲解,这里先使用 root
用户进行演示。
[备注] root
是超级用户,具备操作系统的一切权限。
命令格式
command parameters(命令 参数)
命令 -选项 参数 如: ls -l /usr
长短参数
- 单个参数:ls -a(a 是英文 all 的缩写,表示“全部”)
- 多个参数:ls -al(全部文件 + 列表形式展示)
- 单个长参数:ls --all
- 多个长参数:ls --reverse --all
- 长短混合参数:ls --all -l
参数值
- 短参数:command -p 10(例如:ssh root@121.42.11.34 -p 22)
- 长参数:command --paramters=10(例如:ssh root@121.42.11.34 --port=22)
通配符
shell的内置功能
通配符通常用于匹配文件名。
符号 |
意义 |
---|---|
* |
代表0 个到无穷多个任意字符 |
? |
代表一定有一任意字符 |
[] |
同样代表一定有一个在括号内的字符(非任意字符)。例如 abcd 代表一定有一个字符,可能是 a, b, c, d 这四个任何一个 |
[-] |
若有减号在中括号内时,代表在编码顺序内的所有字符。例如 0-9 代表0到9 之间的所有数字,因为数字是连续的! |
^ |
若中括号内的第一个字符为指数符号(^),那表示取反,例如^abc表示除了a,b,c之外一定有一个字符 |
{str1,str2,…} |
匹配sr1或str2(或更多)其一字符串 |
快捷方式
在开始学习 Linux
命令之前,有这么一些快捷方式,是必须要提前掌握的,它将贯穿整个 Linux
使用生涯。
- 通过上下方向键 ↑ ↓ 来调取过往执行过的
Linux
命令; - 命令或参数仅需输入前几位就可以用
Tab
键补全; Ctrl + R
:用于查找使用过的命令(history
命令用于列出之前使用过的所有命令,然后输入!
命令加上编号(!2
)就可以直接执行该历史命令);Ctrl + L
:清除屏幕并将当前行移到页面顶部;Ctrl + C
:中止当前正在执行的命令;Ctrl + U
:从光标位置剪切到行首;Ctrl + K
:从光标位置剪切到行尾;Ctrl + W
:剪切光标左侧的一个单词;Ctrl + Y
:粘贴Ctrl + U | K | Y
剪切的命令;Ctrl + A
:光标跳到命令行的开头;Ctrl + E
:光标跳到命令行的结尾;Ctrl + D
:关闭Shell
会话;
1.查看路径命令
pwd
显示当前工作目录的路径。
which
查看命令的可执行文件所在路径, Linux
下,每一条命令其实都对应一个可执行程序,在终端中输入命令,按回车的时候,就是执行了对应的那个程序, which
命令本身对应的程序也存在于 Linux
中。
总的来说一个命令就是一个可执行程序。
[root@localhost ~]# pwd
/root
[root@localhost ~]# which python
/usr/bin/python
2.浏览和切换目录
ls
列出文件和目录,它是 Linux
最常用的命令之一。
命令格式: ls [OPTION]... [FILE]...
【常用参数】
-a
显示所有文件和目录包括隐藏的:linux '.'(点)开头的文件默认是隐藏的,-a可以查询所有的文件-l
显示详细列表:它展示了权限,属主,属组,大小,时间,文件名称-h
适合人类阅读的-t
按文件最近一次修改时间排序-i
显示文件的inode
(inode
是文件内容的标识)-F
以"/"结尾的方式展示文件夹-r
倒叙展示,默认的顺序是(a,b,c,d)正序这样展示-R ()
递归展示子目录-lS
按照文件大小降序显示-g
不输出所有者(属主)信息-lG
隐藏所有组(属组)信息-li
显示文件的索引号-lt
按照修改时间排序(倒序)--version
[root@localhost ~]# ls --version ls (GNU coreutils) 8.22 Copyright (C) 2013 Free Software Foundation, Inc. 许可证:GPLv3+:GNU 通用公共许可证第3 版或更新版本<http://gnu.org/licenses/gpl.html>。 本软件是自由软件:您可以自由修改和重新发布它。 在法律范围内没有其他保证。 由Richard M. Stallman 和David MacKenzie 编写。
cd
cd
是英语 change directory
的缩写,表示切换目录。
cd / --> 跳转到根目录
cd ~ --> 跳转到家目录
cd .. --> 跳转到上级目录
cd ./home --> 跳转到当前目录的home目录下
cd /home/lion --> 跳转到根目录下的home目录下的lion目录
cd --> 不添加任何参数,也是回到家目录
[注意] 输入cd /ho
+ 单次 tab
键会自动补全路径 + 两次 tab
键会列出所有可能的目录列表。
du
列举目录大小信息。
【常用参数】
-h
适合人类阅读的;-a
同时列举出目录下文件的大小信息;-s
只显示总计大小,不显示具体信息。
3.浏览和创建文件
cat
比较官方的说法是该命令用于链接文件并打印到标准输出设备上
。这个文本输出命令可以用来查看文件内容,创建内容等
命令格式 : cat [选项]... [文件]...
一次性显示文件所有内容,更适合查看小的文件。
【常用参数】
-n
查看并显示行号- cat 创建一个空文件 b
[root@localhost ~]# ls anaconda-ks.cfg [root@localhost ~]# cat >b <<EOF > EOF [root@localhost ~]# ls anaconda-ks.cfg b [root@localhost ~]#
- cat 清空文件内容
[root@localhost ~]# ls a anaconda-ks.cfg a.txt b [root@localhost ~]# cat a.txt asfdasdfsfsfs [root@localhost ~]# cat >a.txt<<EOF > EOF [root@localhost ~]# cat a.txt [root@localhost ~]#
- cat 写入内容(如果原来有内容将被覆盖)
[root@localhost ~]# cat >a<<EOF > THIS IS MY WEBSITE > WWW.IMYJS.CN > HELLO! > EOF [root@localhost ~]# cat a THIS IS MY WEBSITE WWW.IMYJS.CN HELLO! [root@localhost ~]#
- cat 同时显示多个文件内容
[root@localhost ~]# ls a anaconda-ks.cfg a.txt b [root@localhost ~]# cat a THIS IS MY WEBSITE [root@localhost ~]# cat b WWW.IMYJS.CN [root@localhost ~]# cat a b THIS IS MY WEBSITE WWW.IMYJS.CN [root@localhost ~]#
- 覆盖内容
[root@localhost ~]# ls a anaconda-ks.cfg a.txt b [root@localhost ~]# cat a THIS IS MY WEBSITE [root@localhost ~]# cat b WWW.IMYJS.CN [root@localhost ~]# cat a > b [root@localhost ~]# cat b THIS IS MY WEBSITE
- 追加内容 可以看到用了连个>以后内容是追加的
- cat
--help
[root@localhost ~]# cat --help 用法:cat [选项]... [文件]... 将[文件]或标准输入组合输出到标准输出。 -A, --show-all 等于-vET -b, --number-nonblank 对非空输出行编号 -e 等于-vE -E, --show-ends 在每行结束处显示"$" -n, --number 对输出的所有行编号 -s, --squeeze-blank 不输出多行空行 -t 与-vT 等价 -T, --show-tabs 将跳格字符显示为^I -u (被忽略) -v, --show-nonprinting 使用^ 和M- 引用,除了LFD和 TAB 之外 --help 显示此帮助信息并退出 --version 显示版本信息并退出 如果没有指定文件,或者文件为"-",则从标准输入读取。 示例: cat f - g 先输出f 的内容,然后输出标准输入的内容,最后输出g 的内容。 cat 将标准输入的内容复制到标准输出。 GNU coreutils online help: <http://www.gnu.org/software/coreutils/> 请向<http://translationproject.org/team/zh_CN.html> 报告cat 的翻译错误 要获取完整文档,请运行:info coreutils 'cat invocation' [root@localhost ~]#
less
分页显示文件内容,更适合查看大的文件。
less cloud-init.log
【快捷操作】
- 空格键:前进一页(一个屏幕);
b
键:后退一页;- 回车键:前进一行;
y
键:后退一行;- 上下键:回退或前进一行;
d
键:前进半页;u
键:后退半页;q
键:停止读取文件,中止less
命令;=
键:显示当前页面的内容是文件中的第几行到第几行以及一些其它关于本页内容的详细信息;h
键:显示帮助文档;/
键:进入搜索模式后,按n
键跳到一个符合项目,按N
键跳到上一个符合项目,同时也可以输入正则表达式匹配。
head
显示文件的开头几行(默认是10行)
head cloud-init.log
【参数】
-n
指定行数head cloud-init.log -n 2
tail
显示文件的结尾几行(默认是10行)
tail cloud-init.log
【参数】
-n
指定行数tail cloud-init.log -n 2
-f
会每过1秒检查下文件是否有更新内容,也可以用-s
参数指定间隔时间tail -f -s 4 xxx.log
touch
创建一个文件
touch new_file
mkdir
创建一个目录
mkdir new_folder
【常用参数】
-p
递归的创建目录结构mkdir -p one/two/three
4.文件的复制和移动
cp
拷贝文件和目录
cp file file_copy --> file 是目标文件,file_copy 是拷贝出来的文件
cp file one --> 把 file 文件拷贝到 one 目录下,并且文件名依然为 file
cp file one/file_copy --> 把 file 文件拷贝到 one 目录下,文件名为file_copy
cp *.txt folder --> 把当前目录下所有 txt 文件拷贝到 folder 目录下
【常用参数】
-r
递归的拷贝,常用来拷贝一整个目录
mv
移动(重命名)文件或目录,与cp命令用法相似。
mv file one --> 将 file 文件移动到 one 目录下
mv new_folder one --> 将 new_folder 文件夹移动到one目录下
mv *.txt folder --> 把当前目录下所有 txt 文件移动到 folder 目录下
mv file new_file --> file 文件重命名为 new_file
5.文件的删除和链接
rm
删除文件和目录,由于 Linux
下没有回收站,一旦删除非常难恢复,因此需要谨慎操作!
rm new_file --> 删除 new_file 文件
rm f1 f2 f3 --> 同时删除 f1 f2 f3 3个文件
【常用参数】
-i
向用户确认是否删除;-f
文件强制删除;-r
递归删除文件夹,著名的删除操作rm -rf
。
ln
英文 Link
的缩写,表示创建链接。
学习创建链接之前,首先要理解链接是什么,我们先来看看 Linux
的文件是如何存储的:
Linux
文件的存储方式分为3个部分,文件名、文件内容以及权限,其中文件名的列表是存储在硬盘的其它地方和文件内容是分开存放的,每个文件名通过 inode
标识绑定到文件内容。
Linux 下有两种链接类型:硬链接和软链接。
硬链接
使链接的两个文件共享同样文件内容,就是同样的 inode ,一旦文件1和文件2之间有了硬链接,那么修改任何一个文件,修改的都是同一块内容。
硬链接的缺点是,只能创建指向文件的硬链接,不能创建指向目录的(其实也可以,但比较复杂)而软链接都可以,因此软链接使用更加广泛。
ln file1 file2 --> 创建 file2 为 file1 的硬链接
示例:
[root@localhost ~]# ls
a a_copy anaconda-ks.cfg a.txt b c web.xml zz
[root@localhost ~]# cat zz/t.txt
this is a T.txt
[root@localhost ~]# ln T zz/t.txt
ln: failed to access "T": 没有那个文件或目录
[root@localhost ~]# touch T
[root@localhost ~]# ls
a a_copy anaconda-ks.cfg a.txt b c T web.xml zz
[root@localhost ~]# ln T zz/t.txt
ln: 无法创建硬链接"zz/t.txt": 文件已存在
[root@localhost ~]# ln zz/t.txt TT
[root@localhost ~]# ls
a a_copy anaconda-ks.cfg a.txt b c T TT web.xml zz
[root@localhost ~]# cat TT
this is a T.txt
[root@localhost ~]#
注意:
第一个参数文件file1为需要被创建链接的文件,必须保证其存在。
第二个参数文件file2为新建的链接文件可视为快捷方式,必须保证其不存在,会自动创建。
如果我们用
rm file1
来删除file1
,对file2
没有什么影响,对于硬链接来说,删除任意一方的文件,共同指向的文件内容并不会从硬盘上删除。只有同时删除了file1
与file2
后,它们共同指向的文件内容才会消失。
[root@localhost ~]# rm zz/t.txt
rm:是否删除普通文件 "zz/t.txt"?Y
[root@localhost ~]# ls
a a_copy anaconda-ks.cfg a.txt b c T TT web.xml zz
[root@localhost ~]# cat TT
this is a T.txt
软链接
命令格式 : ln -s
软链接就类似 windows
下快捷方式。
ln -s file1 file2
执行 ls -l
命名查看当前目录下文件的具体信息
[root@localhost ~]# ls
a a_copy anaconda-ks.cfg a.txt b c T TT web.xml zz
[root@localhost ~]# ln -s zz/web.xml WEB
[root@localhost ~]# ls -l
总用量 24
-rw-r--r--. 1 root root 39 5月 11 18:22 a
..... 省略其他文件信息
lrwxrwxrwx. 1 root root 10 5月 11 21:20 WEB -> zz/web.xml # 表示file2 指向 file1
其实 file2
只是 file1
的一个快捷方式,它指向的是 file1
,所以显示的是 file1
的内容,但其实 file2
的 inode
与 file1
并不相同。
如果我们删除了
file2
的话,file1
是不会受影响的,但如果删除file1
的话,file2
就会变成死链接,因为指向的文件不见了。
[root@localhost ~]# ls
a anaconda-ks.cfg b T WEB zz
a_copy a.txt c TT web.xml
[root@localhost ~]# rm -rf zz/web.xml
[root@localhost ~]# ls
a anaconda-ks.cfg b T WEB zz
a_copy a.txt c TT web.xml
[root@localhost ~]# cat WEB
cat: WEB: 没有那个文件或目录