Linux基本操作
一、基本概念
在Linux中,一切都是文件。包括目录、磁盘驱动器还有网络连接等等,他们不过是比较特殊的文件。
在Linux中,文件只有比特和字节流,但是它并不关心他们的组成格式,那是程序才关心的。
文件名的最大长度为255个字符,当然还是控制在80个左右就行
还有在Linux对于文件是会区分大小写的:
bookstobuy.txt
BooksToBuy.txt
BoOkStObUy.txt
以上三个是不同的文件。这要求我们在写文件名的时候需要准确输入命令和文件名
特殊字符
命名时不要使用特殊字符,它允许使用:数字、字⺟(⼤写字⺟或⼩写字⺟)、圆点(.)以及下划线(_)。
不允许使用:“/ ”,但是我们可以使用下划线("_")或者连字符(“-”),但也要注意不能把它放到空格后面。
说到空格,我们也可以使用空格来将文件名进行分割,如books to buy.txt,但是要让shell知道,这些空格是文件名的一部分。
因为shell通常将空格作为参数之间的分割符,
试图直接删除books to buy.txt会让shell产⽣误解,它尝试先删除名为books的⽂件,然后删除名为to的⽂件,最后删除名为buy.txt的⽂件。
通配符及其含义
如果我们想要通过 rm (严格按照大小写来)来批量删除一部分文件,但是这些文件的后缀并不同,而通配符可以完成这个任务.
给出样本为:libby1.jpg ~libby12.jpg、libby.txt 13个文件
有3种通配符:*(星号)、?(问号)、和[ ](⽅括号)。接下来我们依次看看它们的⽤法。
1."*"匹配0或多个任意字符。
命令
|
匹配
|
---|---|
rm libby1*.jpg | libby10.jpg~libby12.jpg,但是不匹配libby1.txt |
rm libby*.jpg | libby10.jpg~libby12.jpg,但是不匹配libby1.txt |
rm *txt | libby1.txt, 但是其他的不匹配 |
rm libby* | 所有都可以 |
rm * | 目录的所有都匹配 |
2."?"”匹配单个字符。
命令
|
匹配
|
---|---|
rm libby1?.jpg | libby10.jpg~libby12.jpg,但是不匹配libby1.txt |
rm libby?.jpg | libby1.jpg~libby9.jpg,但是不匹配libby10.jpg |
rm libby?.* | libby1.jpg~libby9.jpg,libby1.txt |
3."[]" 可以匹配⼀组单个字符(例如,[12]),或者是匹配⽤连字符(“-”)指定的某⼀范围内的字符(例如,[1-3])
命令
|
匹配
|
---|---|
rm libby1[12].jpg | libby11.jpg~libby12.jpg,但是不匹配libby10.jpg |
rm libby1[0-2].jpg | libby11.jpg~libby12.jpg,但是不匹配libby1.jpg |
rm libby1[6-8].jpg | libby6.jpg~libby8.jpg,但是不匹配其他文件 |
二、基础命令
大小写敏感
1.ls(list directory contents)
列出⽬录中的⽂件和⼦⽬录,如果直接在Linux上执行ls,默认home目录,然后就会显示home下的文件以及文件夹
除此之外,还可以在查看其他目录的文件,而且不需要切换到目录。只需要
ls 文件名(或者路径)
还有上面的通配符来配合使用,用来查询多个指定文件例如:
# 列出该文件夹中后缀为txt的文件
ls ~/MyFile/*.txt
#同样我们也可以将 * 变个位置,找到文件名包含“tiger”这个单词的文件
ls ~/MyFile/*tiger*
ls的话还可以对子目录的文件进行遍历,然后输出这个子目录中的所有文件。如图:
如果有很多子目录就算了
每个⽂件夹都以原命令中指定的⽬录作为开始,显示为它们各⾃相对于该⽬录的路径,路径名称后⾯跟着⼀个冒号,接着再列出相应⼦⽂件夹中的所有内容。
#单独一列来显示内容
ls -1 ~/
#可以和递归结合起来,当然如果嫌烦就直接control + C来中断
ls -1R ~/
#列表显示的内容用逗号隔开
ls -m
注意一下,后面的是“1”(一),不是“l”(long)
ls -l 使用来显示文件的详细信息
除了这些看得见的文件,当然还有那些隐藏的文件,我们可以使用
#隐藏文件就是前面有“.”的,例如“.m2”,这个代表的是当前目录,“..”代表它的父目录
ls -a
显示文件类型:
# 显示文件类型:
#⽂件后⾯的“*”(星号)表示该⽂件是可执⾏⽂件,“/”(斜杠)表示它是⼀个⽬录,其他的如图所示
ls -F
ls -F 目录路径
通过颜色来显示内容;
#可执⾏⽂件显示为绿⾊,⽂件夹显示为蓝⾊,普通⽂件显示为⿊⾊
ls --color
#也可以两个都用
ls -F --color
#显示文件的详细信息(long)结果如图(使用Mac演示):
ls -l
我们从右向左看依次为:文件名称和类型、文件被修改的日期和时间(月 日 时分)、文件大小(单位字节)、文件所有者(用户macbookair、组staff)、目录包含的文件数量(文件包含的硬连接 [1])、每个⽂件和⽬录的真正权限[2]
[1]硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除.
[2]十个字符分成四组(以jetbra文件为例):d | rwx|r-x|r-x
第一组是告诉是什么类型文件,具体如图:
而其他的分别代表:对⽂件的所有者(2组)、⽂件的组(3组),以及系统中所有其他⽤户(4组) 的权限
r表示“允许读取”,w表示“允许改写”(改写意味着修改和删除),x表示“允许执⾏”,–则表示“不允许执⾏这个操作”。如果原本应该出现r字符的位置,现在出现的是-,则表示“不允许读取”。这⼀点对于w和x也同样适⽤。
在使用ls -l时进行查询的文件排序是按照(文件名)A-Z,我们可以添加 -r 命令来反转,还有其他的指令:
#查询结果反序
ls -lr
#按照文件最后的修改时间来排序(时间由最近开始排序)
ls -lt
#按照文件的大小来进行排序
ls -lS
#使用K、M、G来显示文件大小
ls -lh
2.pwd(print work directory)
就是搞清楚自己当前在那个位置中,pwd可以显示当前⽬录(或⼯作⽬录)的完整的绝对路径。
3.cd(change directory)
#切换到指定目录中,
cd ~/XXX(指定路径)
#回到home目录
cd ~
#切换到上次访问的目录,注意“-”有几个,就回去几步
cd -
#切换到上级目录
cd ..
cd ../.. //切换到上上级目录
4.touch
#将文件列出来
ls -l 目录
#修改文件的时间,修改为当前时间(注意!!! 如果当前的目录中没有文件,则会创建新的空白文件)
touch 文件
#将文件时间修改为自己想要的时间 -t [[CC]YY]MMDDhhmm[.ss] []中的时间可以不用写
touch -t YYYYMMDDHHMM 文件
#查看文件的时间属性
ls -l testfile
5.mkdir(make directory)
mkdir命令创建的新⽬录是赋予所有者读取、改写、以及执⾏的权限,⽽组以及其他任何⼈则只有读取和执⾏的权限。
#创建新目录
mkdir test
#如果创建失败,则会返回警告(目录已经存在)
mkdir: cannot create directory 'test' : File exists
#创建新⽬录和任何必要的⼦⽬录
mkdir -p XX/XX/XX
#可以查看mkdir新建目录及子目录的过程,只能在创建目录的时候使用它来查看
mkdir -pv XX/XX/XX
mkdir -v XX
6.cp(copy file)
⽤于复制⽂件和⽬录
#复制文件A在同目录下,并将副本命名为B(同目录下必须更名)
cp A B
#复制当前目录文件A到另外的目录中,命名副本为C(当然也可以不用自己命名)
cp A XX/XX/C
#复制其他文件C到其他的目录中,将副本命名为D(当然也可以不用自己命名)
cp XX/XX/C XX/XX/D
#复制其他的文件D到自己当前的目录,名为E(当然也可以不用自己命名)
cp XX/XX/D E
#使用通配符“*”,"[]"等来批量复制文件
cp *.txt XX/XX/
#显示复制过程
cp -v A XX/XX/
#注意!!cp命令不会提醒文件的覆盖,所以我们需要自己防止覆盖已经存在的文件
#如果遇到相同的文件,cp过程会停止并提示:cp: overwrite 'file'?是y否n,然后继续执行cp
cp -i *.txt XX/XX/
#复制目录:注意!你所写的源目录,如果写的只是目录名,那就是复制该目录及其子目录(包含目录中的文件)
# 如果源目录是“目录名/”,那就会只复制它的子目录及其文件
cp -R XX XX
cp -R XX/ XX
#将目录和文件等复制到其他的目录下中作为备份
cp -a XX XX
7.mv(move file)
移动和重命名⽂件
mv命令实际上执⾏了⼀个cp-a操作,在成功复制⽂件后再移除原有的⽂件。
#文件名默认保持不变
mv XX XX/XX
#防止覆盖
mv -i XX XX/XX
#移动过程
mv -v XX XX/xX
#重命名
mv XX XX_bank
#不会覆盖任何已经存在的文件或目录
mv -n XX
8.rm(谨慎使用)
删除文件(remove), 这条命令会彻底地删除⽂件,⽂件将不复存在。
Linux命令⾏可没有“垃圾箱”或“回收站”之类的东⻄。
#命令行:
rm [options] name...
#命令执行过程
rm -v
#删除前注意询问(remove B.txt? 是y 否n)
rm -i filename
#删除空目录(如果目录非空,就会执行失败:rmdir: name: Directory not empty)
rmdir name
#删除文件及非空目录
rm -Rf name
#删除目录及其以下的文件
rm -r name
#删除当前目录下的所有文件和目录
rm -r *
#使用通配符来进行批量删除
#注意进行删除的时候需要注意空格例如:
rm *.txt是删除后缀为 txt的文件,
而rm * txt 意味着要删除所有⽂件,接着再试图删除⼀个名为txt的⽂件。
在删除的时候需要注意以下文件
-
文件名中有空格的
#解决方法:将文件名用 引号“” 括起来 rm "File Name.txt"
-
名称由“-”开头的文件
#解决方法: #1.使用 -- 来提醒命令行,后面的是文件而不是选项 rm -- -Filename.txt #2.使用./让文件作为路径的一部分 rm ./-Filename.txt
9.su(switch user)
切换用户
#了解自己的用户身份
whoami
# 切换用户,执行后需要password,切换之后可以看到环境并没有改变,还是原来的味道
su username
#使用选项 -l (login)切换用户,并且改变环境
su -l username
#变身为root
su
#变身为root, 顺便把环境变一下
su -
三、学习命令
man
1. 手册界面
可以使用man来了解指令的用法,
#打开手册页面
man 指令(例如ls)
手册基本上分为几个部分:
NAME(命令名称)——命令的名称和简要的介绍。
SYNOPSIS——命令的基本格式。
DESCRIPTION——描述命令功能的概要介绍。
OPTIONS(选项)——man命令最基本的部分:命令的各种选项,
以及对每个选项的简短介绍。
FILES(⽂件)——命令使⽤的其他⽂件。
AUTHOR(作者)——编写命令的作者,以及联系信息。
BUGS(错误)——已知的错误,以及如何报告新错误。
COPYRIGHT(版权声明)——它的意义很明显,即版权信息。
SEE ALSO(参⻅)——其他相关的命令。
2. 查找命令
模模糊糊记得那个命令,但是有些不确定,我们可以使用这个:
#根据功能搜索命令
man -k list
#根据名称来搜索命令
man -f rm
#更新man数据库
man -u
info
Info⻚⾯⽐man page编写得要更好、更容易理解,也更友好
info info(q退出)
四、组合命令
;
将命令都写在一行中,每个命令之间用“ ; ”分割开
#先创建一个文件,然后将它移动到另一个目录下,将它删除
touch test.txt; mv -v test.txt ~/test/VI/; rm -i ~/test/VI/test.txt
在执行命令时,要注意书写正确,因为一个命令的错误执行,在一个命令还是会执行的,但是这个命令需要上一个命令的结果,但是因为命令的错误,导致后面所有的指令都无法正确执行。
&&
所以就有了“ && ”,表示只有上一个命令成功才能执行在一个命令。
||
那么|| 就是上一个命令失败执行后,才会运行下一个命令
$()
将一个命令的输出结果,插入到另一个命令中。
这个不难理解,就是像System.out.println(1+2); 先计算1+2,然后根据输出的结果执行sout。
|(pipe 管道)
键盘的输入:标准的输入流stdin,
终端上所输出的是:标准输出流stdout
如果报错信息在终端上显示:标准错误流stderr
了解了输入流、输出流我们就可以将数据流进行重定向;
“|”将⼀个命令的输出⽤作另⼀个命令的输⼊:
#查询文件夹的内容
ls -1
#可以将输出的结果通过输出管道发给less,让我们可以在一页中查看结果(q 退出)
ls -1 | less
>
将命令的输出重定向到⽂件
通常,输出是显示在屏幕上的,因此称其为标准输出(stdout)设备。如果不想将输出结果显示到屏幕上,则可以使⽤>(⼤于号)字符将输出存到⽂件中。
#可以先创建一个文件
touch test.txt
#将查询的内容存到这个文件中
#注意!如果这个文件不存在,就会创建,如果存在,便会直接覆盖
ls -1 > test.txt
>|
如果想要防止重定向的时候覆盖重要文件,我们可以开启noclobber,开启之后想覆盖文件输出就要用 " >|”来替代“>”.
#打开noclobber
set -o noclobber
#将查询的内容存到这个文件中,并且要覆盖这个文件
ls -1 >| test.txt
#如果不想覆盖
ls -1 > test1.txt
#关闭noclobber
set +o noclobber
>>
这个也是将输出结果存到文件中,但不是用直接覆盖的方式,而是在文件原来的内容进行追加
ls -1 >> test.txt
<
有些命令不能直接打开⽂件,在这种情况下,<(⼩于号)就是你需要的解决⽅法
#echo 会重现“”中输如的内容
echo "Hello word"
#所以我们有echo来显示文件的内容
echo < test.txt