目录与路径

当执行命令时,该命令不需要输入绝对路径,这与PATH这个变量有关

相对路径与绝对路径

  • 相对路径:路径的写法由根目录(/)写起
  • 相对路径:路径的写法不是由根目录(/)写起

相对路径的用途

  • 同目录下创建文件等使用相对目录不易出错
  • 使用方便

绝对路径的用途

  • 绝对路径的正确性比较好,尤其是对于shell脚本。如果相对路径在程序中,可能由于执行的工作环境不同,导致一些问题的发生

目录的相关操作

特殊的目录

比较重要

  • .代表此层目录
  • ..代表上一层目录
  • -代表前一个工作目录
  • ~代表目前使用者身份坐在的家目录
  • ~account 代表account这个使用者的家目录(account是账号的名称)
    image.png
    Linux下的根目录存在.与..代表有上层目录,但..的属性与.完全相同,代表根目录的上层目录还是为根目录
    image.png

处理目录的命令

cd:切换目录 chang directory
pwd:显示当前目录 print working directory
mkdir:建立一个新目录 make directory
redir:删除一个空目录

cd

当登录Linux后,每个账号都会在自己账号的家中即~
cd :cd后什么也不加默认进入自己的家目录
image.png

pwd

pwd -LP:显示出正真的路径,而非链接文件本身的目录
image.png

mkdir

mkdir [-mp] 目录名称
-m:设置文件的权限,直接设置,不适用默认权限(umask)
-p:直接将所需要的目录(包含上层目录)递归创建
image.png
image.png
image.png

rmdir

-p:连同上层“空的”目录也一起删除
rmdir只能删除空目录
image.png

关于执行文件路径的变量:$PATH

可以在任何地方直接执行BASH SHELL是因为环境变量PATH的帮助所致
例如:
执行SHELL命令ls的时候,系统会依照PATH的设置去每个PATH定义的目录下查找文件名为ls的可执行文件,如如果在PATH定义的目录中含有多个文件名为ls的可执行文件,那么先查找到的同名命令先被执行
image.png
PATH这个变量的内容是由一堆目录所组成,每个目录中间用(:)来隔开,每个目录有顺序之分,如果有重复的SHELL则先使用PATH路径中靠前的。
image.png
root和普通用户的PATH变量都有/bin或/usr/bin,所以能够在任何地方都可以执行/bin内命令(例如ls)

  • 当SHELL不在PATH时,是无法直接输入SHELL命令执行的
  • 当SHELL不在PATH时,可以输入SHELL全路径执行,如果在SHELL所在目录可以使用./COMMAND 执行
  • 加入环境变量后可直接使用:
    PAHT="$
    :/路径"
    例如PAHT="$
    :/root" 即将/root目录加入环境变量

文件与目录管理

显示属性、复制、删除文件及移动文件或目录等

文件目录的查看:ls ll

ls [-aAdfFhilnrRST] 文件名或目录名称
ls [--color={never,auto,always}] 文件目录或名称
ls [--full-time] 文件名或目录名称
重要选项参数:

  • -a:全部的文件,连同隐藏文件
  • -d:仅列出目录,而不是列出目录内的文件
  • -l:详细信息显示,包含文件属性与权限等数据
    ls执行时非隐藏文件的文件名、以文件名进行排序及文件名代表的颜色显示
    Linux发行版默认ll设置为 ls -l 即显示非隐藏文件的详细信息与权限属性

复制、删除与移动:cp、rm、mv

cp(copy)除了复制之外,还可以建立链接文件(快捷方式),对比两文件的新旧而予以更新,复制整个目录功能
mv(move)移动目录与文件,重命名
re(remove)删除

cp 复制文件或目录

复制时如果要完全复制权限等要cp -a,尤其是一些重要的权限,例如账号密码等
cp [-adfilprsu] 源文件(source) 目标文件 (destination)
cp [options] source1 source2 source3 .... directory
重要选项参数:

  • -a:相当于-dr --preserve=all
  • -d:若源文件为链接文件的属性(link file),则复制链接文件属性而非文件本身
  • -i:若目标文件(destination)已经存在时,在覆盖时会先询问操作的进行
  • -l:进行硬链接(hard link)的链接文件建立,而非复制文件本身
  • -p:连同文件的属性(权限、用户、时间)一起复制过去,而非使用默认属性(备份常用)
  • -r:递归复制,用于目录的复制操作;
  • -s:复制称为符号链接文件(symbolic link),即“快捷方式”文件
  • -u:destination比source旧才更新destination,或destination不存在的情况下才复制
  • -preserve=all:除了-p的权限相关参数外,还加入SELinux的属性,links、xattr等也复制;如果源文件有两个以上,则最后一个目标文件一定要是“目录才行”
    如果直接 cp 目标文件 目标目录 则文件的属性、权限、建立时间都会改变,所有将所有特性都一起复制必须要加上 -a或 -p
  • 如果复制别人的数据(该文件必须拥有read的权限),总是希望复制道德数据最后是自己的,在默认的条件中,cp的源文件与目标文件的权限是不同的,目标文件的拥有者通常会是命令操作者本身。一些敏感的文件在复制给其他人,或从其他人文件复制得到时要特别注意权限
    下图为创建链接(快捷方式)方法
    image.png
    cp -l:软链接(符号链接),建立快捷方式指向(->)需要链接到的文件
    cp -s:硬链接,其建立的文件与源文件的属性与权限完全一模一样
    image.png

cp 文件 文件 文件 目录
复制多个文件则最后参数必须为目录

cp -u 源文件 目标文件
在目标文件与源文件有差异时,才会复制,如果目标文件不存在也会复制
总结:在cp复制时,应该考虑到

  • 是否需要完整的保留源文件的信息
  • 源文件是否为符号链接文件(symbolic link file)
  • 源文件是否为特殊的文件,例如FIFO、socket等
  • 源文件是否为目录

rm 删除文件或目录

rm [-fir] 文件或目录
重要选项参数:

  • -f:忽略不存在的文件,不会出现警告信息,force
  • -i:交互模式,在删除前会询问使用者是否操作
  • -r:递归删除,最常用于目录的删除,这是非常危险的选项
    image.png
    总结:
    在Linux系统下,为了怕文件被root误删,很多发行版默认rm 命令为rm -i,用于提醒是否确认删除。但使用rm -r的时候不会再次询问是否删除,所以该命令相当危险
    当在文件名含有(-)时,直接 rm -文件名会被默认为无效的SHELL命令。此时若在同级目录可使用相对路径rm ./-文件名 或者使用全路径rm /路径/文件名。或者通过rm -- -文件名也可以

mv 移动文件与目录,或重命名

mv [-fiu] source destination
mv [options] source1 source2 source3 .... directory
重要选项参数

  • -f:如果目标文件已经存在,不会询问而直接覆盖
  • -i:若目标文件(destination)已经存在时,就会询问是否存在
  • -u:若目标文件已经存在,且source比较新,才会更新
    mv 在同级目录下则可以重命名,或使用rename命令
    mv
    image.png
    rename
    image.png

获取路径的文件名与目录名称

获取文件名 basename
获取路径目录dirname
image.png

文件内容查看

最常用的查看文件内容的命令为cat、more、less、tac、tail

  • cat:由第一行开始显示文件内容
  • tac:从最后一行开始
  • nl:现实的时候同时输出行号
  • more:一页一页地显示文件内容
  • less:与more类似,可以往前翻页
  • head:只看前面几行
  • tail:只看后面几行
  • od:以二进制的方式读取文件内容

直接查看文件内容 (cat、tac、nl)

直接查看一个文件的内容一次性读取可以使用cat/tac/nl这几个命令

cat(concatenate)

cat [-AbEnTv]
cat为Concatenate(串联)的简写,主要功能是将一个文件的内容连续打印在屏幕上。
但文件内容行数过多的时候cat不太实用,因为换行太快,来不及观察屏幕上的结果
重要选项参数

  • A:相当于-vET的整合选项,可列出一些特殊字符而不是空白而已
  • b:列出行号,仅针对非空白行做行号显示,空白行不标行号
  • E:将结尾的换行符$显示出来
  • n:打印出行号,连同空白行也会有行号,与-b的选项不同
  • T:将[Tab]按键以^I显示出来
  • v:列出一些看不出来的特殊字符
    image.png

tac(反向2列示)

与cat不同的是由最后一行到第一行反向在屏幕上显示出来

nl(添加行号打印)

nl [-bnw] 文件
重要选项与参数:

  • -b:指定行号指定的方式
    -b a:表示不论是否为空行,也同样列出行号(类似cat -n)
    -b t:如果有空行,空的那一行不要列出行号(默认值)
  • -n:列出行号表示的方法,主要有三种
    -n ln:行号在栏位的最左方显示
    -n rn:行号在栏位最右方显示,且不加0
    -n rz:行号在栏位最右方,且加0
  • -w:行号栏位的占用的字符数
    image.png
    image.png
    总结:nl可以将输出地文件内容自动地加上行号,且可以将行号做比较地显示设计,包括位数与是否自动补齐0等功能

可翻页查看 (more、less)

一页一页地查看数据,而非一次性读取more、less

more(一页一页翻动)

image.png
上图是日志记录文件,如果文件内容行数大于屏幕输出地行数时,最后一行会显示出目前显示地百分比,而且还可以在最后一行输入命令。
按键:

  • 空格键(space):代表向下翻一页
  • Enter:向下翻一行
  • /字符串:代表在这个显示的内容当中,向下查找字符串这个关键词
    重复查找通过一个字符串,可以直接按下n即可
  • :f:立刻显示出文件名以及目前显示地行数
  • q:退出more命令
  • b或Ctrl+b:代表往回翻页,只对文件有用,对管道无用

less(一页一页翻动)

与more相似,但可以向前翻页,比more功能更多
按键:

  • 空格键:向下翻一页
  • pagedown:向下翻动一页
  • pageup:向上翻动一页
  • /字符串:向下查找字符串的功能
  • ?字符串:向上查找字符串的功能
  • n:重复前一个查找(与/或?有关)
  • N:反向的重复前一个查找(与/或?有关)
  • g:前进到这个数据的第一行
  • G:前进到这个数据的最后一行去(注意大小写)
  • q:退出less命令
    man命令就是通过调用less来显示说明文件的内容

数据截取 (head、tail)

head和tail都是以“行”为单位来进行数据截取的

head(取出前几行)

head [-n number] 文件
选项参数:

  • -n:后面接数字,代表显示几行的意思。默认显示前10行

tail (取出后面几行)

tail [-n number] 文件
选项与参数:

  • -n:后面接数字,代表显示几行的意思,默认显示后10行
    tail -n number 文件 :显示最后number行的数据
    tail -n +number 文件:显示从number行开始的所有数据
  • -f:表示持续刷新显示后面所接文件中的内容,要等到按下Ctril+c才会结束
    Ctrl+z和Ctrl+c退出命令
    总结:
  • 1.取出某个文件的第11行到20行:
    head -n 20 文件名|tail -n 10
    这2个命令有管道符号(|),管道的意思即为:前面的命令所输出的信息,通过管道交由后续的命令继续使用。该命令即为:先将文件内的前20行取出来,但不输出到屏幕上,而是转交给后续的tail命令。因此tail不需要接文件名,因为tail所需要的数据来自于dead处理后的结果。
    image.png
  • 2.取出某个文件的第11行到20行,且列出真确的行号
    cat -n 文件名|head -n 20|tail -n 10
    注意下图cat出现的顺序不同则相应的结果不同
    image.png

非纯文本文件:od

以读取文本文件的命令读取非文本文件时(二进制文件)会产生乱码,则可以用od读取非纯文本文件
od [-t TYPE] 文件

  • -t:后面可以接各种【类型(TYPE)】的输出:
    a:利用默认的字符来输出
    c:使用ASCII字符来输出
    d[size]:利用十进制(decimal)来输出数据,每个整数占用size Bytes
    f[size]:利用浮点数值(floating)来输出数据,每个占用size Bytes
    o[size]:利用八进制(octal)来输出数据
    x[size]:利用十六进制(hexadecimal)来输出数据

od -t| oCc 文件名
将文件名的二进制码和ASCII码列出
image.png
echo password|od -t oCc
管道对password进行ASCII处理

修改文件时间或创建新文件:touch

Linux下会记录许多时间参数,主要有3个变动时间

  • 修改时间(modification time,mtime)经常使用到
    当文件的【内容数据】变更时,就会更新这个时间,内容数据指的是文件的内容,而不是文件的属性或权限
  • 状态时间(status time,ctime)
    当该文件的【状态(status)】改变时,就会更新这个时间,权限与属性被更改了,都会更新这个时间
  • 读取时间(access time,atime)
    当【该文件的内容被读取】时,就会更新这个读取时间(access),使用cat读取文件时,就会更新该文件的atime
    image.png
  • 默认情况ll、ls -l显示出来的时间时该文件的mtime,就是这个文件的内容上次被修改的时间,如果未被修改即为创建时间,如果因为时区错误导致文件时间提前了,或BIOS设置错误,导致系统时间提前并且建立了文件,修改时间后文件时间也会提前,则可以通过touch命令修改时间

touch[-acdmt] 文件

选项参数

  • -a:仅自定义读取时间(access time)
  • -c:仅修改文件的时间,若该文件不存在则不建立新文件
  • -d:后面可以接欲自定义的日期而不用目前的日期,也可以使用--date=“日期或时间”
  • -m:仅修改修改时间(modification time)
  • -t:后面可以接欲自定义的时间而不用目前的时间,格式为(YYYYMMGGhhmm)
    touch 文件 ,该文件的三个时间都为当前命令执行时间,如果文件不存在,则创建一个新的大小为0的文件
    总结:
  • touch可以自定义文件的日期时间,也可以建立一个空文件
  • 复制文件时,可以复制属性,但不能复制ctime(记录文件最近被修改时间)的属性
  • touch最常被用来建立一个空文件、将某个文件日期定义为目前(mtime与atime)

文件与目录的默认权限与隐藏权限

  • 一个文件有若干个属性,包括读、写、执行(r、w、x)等基本权限以及是偶为目录(d)与文件(-)或是链接文件(l)等属性
  • 除了r、w、x权限外,在Linux传统的ext2、ext3、ext4文件系统下,还可以设置其他的系统隐藏属性,这部分可以用chattr设置,而以lsattr来查看,最重要的属性就是可以设置其不可修改的特性,连让文件的拥有者都不能进行修改

文件默认权限:umask

  • 建立一个新的文件或目录时,umask就是指定目前用户在建立文件或目录时候的权限默认值

查看umask

image.png
root的umask默认是022(限制用户组和其他人的读),这是基于安全的考虑,至于一般身份用户,通常默认为002

  • umask
    umask 有四组数字,第一组时特殊权限,后三组对应所有者、用户组、其他人
    umask的数字指的是该默认值需要减掉的权限,例如0则是不减所有权限,为读写执行,1为去除执行,2为去除写,3去除写、执行,4去除读,5去除执行、读,6去除写、读,7去除所有权限
  • umask -S
    默认权限属性上,文件和目录是不一样的:
  • 用户建立为文件默认没有可执行(x)权限,只有rw这两个项目,最大为666(-rw-rw-rw)
  • 用户建立为目录,x与是否可以进入此目录有关,默认所有权限均开放,即777(rwzrwzrwz)

设置umask

  • umask [000~777]
    unask对于新建文件与目录的默认权限是很有关系的。对于SAMBA服务器和FTP服务器都是很重要的概念,这牵涉到用户是否能够将文件进一步利用的问题,很重要

文件隐藏属性

文件除了9个属性之外还有隐藏属性,这对系统和安全非常重要。chattr命令只能在ext2、ext3、ext4的Linux传统文件系统上面完整生效,其他文件系统可能无法完整支持命令

chattr(配置文件隐藏属性)

chattr [+-=] [ASacdistu] 文件目录或名称
重要选项与参数:

  • +:增加某一个特殊参数,其他原本存在参数则不动
  • -:删除某一个特殊参数,其他原本存在参数则不动
  • =:直接这只参数,且仅有后面接的参数
  • A:当设置了A这个属性时,若你在存取此文件(或目录)是,它的存取时间atime将不会被修改,可避免I/O较慢的及其过度的读写磁盘(目前建议使用文件系统挂载参数处理这个项目)
  • S:
  • a:当设置a之后,这个文件将只能增加数据,而不能删除也不能修改数据,只有root才能设置这属性
  • c:
  • d:
  • i:可以让一个文件【不能被删除、改名、设置链接、写入或新增数据】,对于系统安全相当有帮助,只有root才能设置
  • s:
  • u:
    xft文件系统仅支持AadiS
    image.png
    如果设置文件 chattr属性为i,则root都无法删除,必须先去除属性

lsattr(显示文件隐藏属性)

lsattr [-adR] 文件或目录
重要选项与参数:

  • a:将隐藏文件的属性显示出来
  • d:如果接的是目录,仅列出目录本身的属性而非目录内的文件名
  • R:连同子目录的数据也一并列出来
    image.png
    image.png

文件特殊权限:SUID、SGID、SBIT

image.png
除了上述之外还有s、t

Set UID

当s这个标志出现在文件拥有者的x权限上时,此时就被称为Set UID,简称为SUID
SUID限制与功能:

  • SUID权限仅对二进制程序有效
  • 执行者对于该程序需要具有x的可执行程序
  • 本权限仅在执行该程序的过程中有效
  • 执行者将具有该程序拥有者的权限
    SUID仅可用在二进制程序上,不能够用在shell脚本上面(因为shell脚本只是将很多的二进制执行文件调用执行而已)。

SetGID

Sticky Bit

SUID/SGID/SBIT权限设置

观察文件类型:file

查看某个文件的类型,例如ASCII、数据文件或二进制文件,有无使用动态链接库(share library)等信息,可以利用file命令查看
image.png
通过该命令可以简单地先判断这个文件的格式是什么,和tar包判断使用的是哪一种压缩方式

命令与文件的查找

脚本文件的查找

which (查找【执行文件】)

which [-a] command
选项或参数:

  • -a:将所有PATH目录中可以找到的命令均列出,而不止第一个被找到的命令名称
    image.png
  • which是根据【PATH】这个环境变量所规范的路径,去查找执行文件的文件名,若加上-a,则可以列出所有的可以找到的同名执行文件,而非仅显示第一个。
  • which默认查找PATH内所设置的目录,所以找不到bash内置的history。但是可以通过type查找到

文件的查找(find、whereis、locate)

一般先使用whereis或locate来查找,find速度较慢,影响硬盘性能,一般不常用。
whereis只查找系统中某些特定目录下面的文件
locate利用数据库来查找文件名

whereis(由一些特定的目录中查找文件)

whereis [-bmsu] 文件或目录名
选项参数:

  • -l:可以列出whereis回去查询的几个主要目录
  • -b:只找binary(二进制)格式的文件
  • -m:只找在说明文件manual路径下的文件
  • -s:只找source源文件
  • -u:查找不在上述三个项目当中的其他特殊文件
    whereis主要是针对/bin/sbin下面的执行文件,以及/usr/share/man下面的man page文件,跟几个比较特定的目录

locate/updatedb

locate [-ir] keyword
选项与参数:

  • -i:忽略大小写的差异
  • -c:不输出文件名,仅计算找到的文件数量
  • -l:仅输出几行的意思,例如输出五行则是-l 5
  • -s:输出locate所使用的数据库文件的相关信息,包括该数据库记录的文件/目录数量等
  • -r:后面可接正则表达式的显示方式
    image.png
    locate后面直接输入文件的部分名称后,只要完整文件名(包含路径名称)当中只要有文件的部分名称在其中,就会被显示出来,在忘记某个文件完整名时相当有用。
    locate是经由数据库来查找的,而数据库的建立默认是在每天执行一次(每个Linux发行版都不同),所以新建立的文件若没有更新数据库则无法查找到。可以使用updatedb命令手动更新数据库。
  • updatedb:根据/etc/updatedb.conf的设置取查找系统文件硬盘内的文件,并更新/var/lib/mlocate内的数据库文件
  • locate:依据/var/lib/mlocate内的数据库记录,找出用户所输入关键词的文件名

find

find [PATH] [option] [action]
选项与参数:
1.与时间有关的选项:共有-atime,-ctime与-mtime,以-mtime说明

  • -mtime n:n为数字,意义为在n天之前的【一天之内】被修改过内容的文件
  • -mtime +n:列出在n天之前(不含n天本身)被修改过内容的文件
  • -mtime -n:列出在n天之内(含n天本身)被修改过内容的文件
  • -newer file:file为一个存在的文件,列出比file还要新的文件
    总结:
  • +4代表大于等于5天前的文件
  • -4代表小于等于4天内的文件
  • 4则代表4-5那一天的文件
    2.与使用者或用户组名称有关的参数
  • -uid n:n为数字,这个数字是使用者的账号ID,亦即UID,记录在/etc/passwd里面
  • -gid n:n为数字,这个是用户组名称的ID,亦即GID,记录在/etc/group
  • -user name:name为使用者账号名称
  • -group name:name为用户组名称
  • -nouser:查找文件的拥有者不在/etc/passwd中
  • -nogroup:查找文件的拥有用户组不存在于/etc/group的文件。
    当自行安装软件时,很可能该软件的属性当中并没有文件拥有者,在这个时候,就可以使用-nouser与-nogroup查找
    image.png
    总结:
  • 1.可以快速查找到某个用户或用户组创立的文件
  • 2.可以查找到不属于任何用户和用户组的文件(当从网络上下载文件时不属于其他用户,用户组;当文件所属的用户和用户组被删除后,则该文件不属于任何用户及用户组)
    3.与文件权限及名称有关的参数:
  • -name filename:查找文件名称为filename的文件
  • -size [+-]SIZE:查找比SIZE还要大(+)或小(-)的文件,这个SIZE的规格有:
    c:代表Bytes
    k:代表1024Bytes
    M:M
  • -type TYPE:查找文件的类型为TYPE的,类型主要有:
    f:一般正规文件
    b、c:设备文件
    d:目录
    l:链接文件
    s:socket
    p:FIFO
  • -oerm mode:查找文件权限刚好等于mode的文件,这个mode为类似chmod的属性值,例如-rwsr-xr-x的属性为4755
    4.额外可进行的操作:
  • -exec command:command为其他命令,-exec后面可再接额外的命令(不支持命令别名ll,仅能使用ls -l)来处理查找到的结果
  • -print:将结果打印到屏幕上,这个操作是默认操作
    image.png
    总结:find的特殊功能就是能够进行额外的操作(action)。上图示例的{}、;、 -exec意义为
  • {}代表的是由find找到的内容,find的结果会被放置到{}位置中
  • -exec一直到;是关键词,代表find额外操作的开始(-exec)到结束(;),在这中间的就是find命令内的额外操作。(上例为ls -l{})
  • 因为;在bash环境下是有特殊意义的,因此利用反斜杠来转义
  • find还可以利用通配符来查找文件名
    例如:find /etc -name "httpd"
    image.png
    image.png

这个家伙很懒,啥也没有留下😋