第六章 Linux 文件与目录配置
6.1目录与路径
6.1.1 相对路径与绝对路径
6.1.2 目录的相关操作
cd //变换目录
. //代表此层目录
.. //代表上一层目录
- //前一个工作目录
~ //[目前用户身份]所在的home目录
~account //account用户的home目录
需要注意的是:所有目录底下都会存在两个目录,分别是[.]与[…]分别代表次层与上层目录。特例:根目录下面也有[.]与[…],不过[…]与[.]是同一个目录。
常用目录处理指令:
- cd:变换目录
- pwd:显示当前目录
- mkdir:建立一个新目录
- rmdir:删除一个空目录
** cd(change directory,变换目录)**
** pwd(显示目前所在的目录)**
** mkdir(建立新目录)**
** rmdir(删除[空]的目录)**
6.1.3 关于执行文件路径的变量:$PATH
我们知道ls指令的完整文件名为:/bin/ls,之所以能在所有目录下多执行,是因为环境变量PATH的帮助。PATH(一定大写)是由一堆目录组成,中间用(:)隔开。
执行一个指令时,系统会依照PATH设定去每个PATH定义的目录下搜索指定的可执行文件,如果存在多个就先搜索到先执行。可以执行echo $PATH查看有哪些目录被定义下来。
6.2文件与目录管理
6.2.1 文件与目录的检视ls
ls [-aAdfFhilnrRSt] 文件名
ls [--color={never,auto,always}] 文件名
ls [--full-time] 文件名
@TODO
ls -al ~ //将目录下的所有文件列出来(含属性与隐藏文件)
ls -alF --color=never ~ //将目录下的所有文件列出来,不显示颜色,但在文件名末显示出该文件名代表的类型
ls -al --full-time ~ //完整的呈现文件的修改时间(modification time)
ls默认显示的只有:非隐藏的文件名,以文件名进行排序及文件名代表的颜色显示。
6.2.2 复制,删除与移动:cp,rm,mv
** cp(复制文件)**
cp(copy)是复制文件指令,还可以建立快捷方式,比较两文件的新旧而予以更新,复制整个目录等功能。
cp [-adfilprsu] [来源文件] [目标文件]
cp [options] [source1 ,directory]
cp指令会因身份的不同而有很大差异。
![](/qrcode.jpg)
//例一:用root 身份,将父目录下的.bashrc复制到/tmp下,并改名为bashrc
cp ~/.bashrc /tmp/bashrc
cp -i ~/.bashrc /tmp/bashrc
@TODO
//变换目录到/tmp,并将/var/log/wtmp复制到/tmp且观察属性:
cd /tmp
cp /var/log/wtmp . //想要复制到当前目录,最后.不要忘
ls -l /var/log/wtmp wtmp
cp -a /var/log/wtmp wtmp2
ls -l /var/log/wtmp wtmp2
一般系统默认设置中,cp的来源文件与目标文件的权限是不同的,目标文件的拥有者通常是指令操作者本身。由于这个特性,当我们进行备份或某些需要特别注意的特殊权限文件,不能直接用cp,而必须要加上-a或者-p等可以完整复制文件权限的选项才行。另外,复制文件给其他使用者时,也要注意文件的权限。
//例三:复制/etc/ 目录下的所有内容到/tmp下。
cp /etc/ /tmp
cp -r /etc/ /tmp
//-r 可以复制目录,但是权限可能会被改变,所以也可以利用cp -a /etc /tmp指令。
//例四:将例一复制的bashrc建立一个快捷方式
ls -l bashrc
cp -s bashrc bashrc_slink
cp -l bashrc bashrc_slink
ls -l bashrc*
-l 建立的是实体链接(hard link)。连接后,其指向的文件link数+1。;-s则是符号链接(symbolic link),它会连接到指定文件,所以你能看到文件名右侧有个指向符号(->)。
//例5:若~/.bashrc 比 /tmp/bashrc 新才复制过来
cp -u ~/.bashrc /tmp/bashrc
//常用在备份工作中。
//例6:将例4造成的bashrc_slink复制成bashrc_slink_1与bashrc_slink_2
cp bashrc_slink bashrc_slink_1
cp -d bashrc_slink bashrc_slink_2
ls -l bashrc bashrc_slink*
@TODO
//例7:将父目录的.bashrc及.bash_history 复制到/tmp下
cp ~/.bashrc ~/.bash_history /tmp
//可以将多个数据一次复制到同一个目录去,最后一定是目录。
//例。以dmt身份复制文件
cp -a /var/log/tmp /tmp/dmt_wtmp
ls -l /var/log/tmp /tmp/dmt_wtmp
//cp指令虽然能复制文件,但不能修改其拥有者和群组。
由于cp有种种文件属性与权限,所以在复制时要搞清楚:
- 是否需要完整的保留来源文件
@TODO
** rm(移除文件或目录) **
rm [-fir] 文件
@TODO
//例1:将刚刚在cp的范例中建立的bashrc删除掉
cd /tmp
rm -i bashrc
//例2:通过通配符*的帮助,将/tmp底下开头为bashrc的文件名通通删除
rm -i bashrc*
//*代表的是0到无穷多个任意字符。
//例3:将cp范例中建立的/tmp/etc/ 目录删除掉
rmdir /tmp/etc
rm -r /tmp/etc
//上一行指令,由于系统默认设置了-i选项,没一个文件都会提示你按y。如果确认要删除某目录可以如下操作:
\rm -r /tmp/etc //删库跑路指令,慎用
//指令前加反斜杠,可以忽略掉alias的指定选项。
//例4:删除一个带有-开头的文件
touch ./-aaa-
ls -l
rm ./-aaa-
如果子目录里还有子目录时,删除要使用-r选项。但使用rm -r时一定要慎重。
** mv(移动文件与目录,或更名)**
mv [-fiu] source destination
mv [options] source1 source2
@todo
//例1:复制一文件,建立一目录,将文件移动到目录中
cd /tmp
cp ~/.bashrc bashrc
mkdir mvtest
mv bashrc mvtest
//例2:将刚刚目录更名为mvtest2
mv mvtest mvtest2
//如果要同时改多个文件名,尝试rename
//例3:再建立两个文件,再全部移动到/tmp/mvtest2 中
cp ~/.bashrc bashrc1
cp ~/.bashrc bashrc2
mv bashrc1 bashrc2 mvtest2
6.2.3 取得路径的文件名与目录名称
basename /etc/sysconfig/network
network //此为文件名
dirname /etc/sysconfig/network
/etc/sysconfig // 目录名
6.3 文件内容查阅
查阅一个文件的内容时,可以使用指令来查看。
- cat:由第一行开始显示文件内容
- tac:从最后一行开始显示,tac就是cat倒写的
- nl:显示的时候,顺道输出行号
- more:一页一页的显示文件内容
- less与more类似,它可以往前翻页
- head:只看头几行
- tail:只看末尾几行
- od:以二进制的方式读取内容
6.3.1 直接查看文件内容
cat(concatenate)
cat [-AbEnTv]
@TODO
//例1:查看/etc/issue 文件内容
cat /etc/issue
//例2:承上题,加印行号呢。
cat -n /etc/issue
//如果空白行不想加行号,尝试cat -b /etc/issue。
//例3:将/etc/man_db.conf 的内容完整显示出来(包含特殊字符)
cat -A /etc/man_db.conf
tac(反向列示)
tac /etc/issue
从最后一行到第一行反向在屏幕上显示
nl(添加行号打印)
nl [-bnw] 文件
//例1:用nl 列出/etc/issue的内容
nl /etc/issue
//例2:空白行也加上行号
nl -b a /etc/issue
//例3:在行号前补0,预设是6位数
nl -b a -n rz /etc/issue
//例4:在行号前补0时,改为3位数。
nl -b a -n rz -w 3 /etc/issue
6.3.2 可翻页显示
前面的nl,cat与tac都是一次性将数据全部显示,有没有一页一页翻动的指令?那就是more与less。
more(一页一页翻动)
more /etc/man_db.conf
运行后,最下方会显示目前显示文件的百分比。而且可以在最后一行输入一些有用的指令:
- 空格键(space):向下翻一页
- Enter:向下翻一行
- /字符串:在这个显示的内容当中,向下搜索[字符串]这个关键词
- :f :立刻显示出文件名及目前显示的行数;
- q:代表立刻离开more,不再显示该文件内容;
- b或[ctrl]-b:代表往回翻页,只对文件有用,对管线无用。
在more界面,输入/后,就在等待你输入。输入字符串后,按下Enter后,就会向下搜索该字符串,重复搜索同一个字符串按n即可。
less(一页一页翻动)
less /etc/man_db.conf
less比more更加有弹性。more只能向后面翻,使用less,就可以用PageUp,Pagedown前后翻了。less里还有更多搜索功能。less可以输入指令:
- 空格键:向下翻动一页
- PageUp:向上翻一页
- Pagedown:向下翻一页
- /字符串:向下搜索[字符串]的功能
- ?字符串:向上搜索[字符串]的功能
- n:重复前一个搜寻(与/或?有关!)
6.3.3 资料采取
我们可以将输出的资料作一个采取,就是取出前面几行或后面几行。要注意,head和tail都是行为单位。
head(取出前面几行)
head [-n number] 文件
//-n :后面接数字,代表几行
head /etc/man_db.conf
// 默认是显示前10行。
head -n -100 /etc/man_db.conf
// 最后面100行不打印。
tail(取出后面几行)
tail [-n number] 文件
//-f:表示持续侦测后面所街的文件名,等按下Ctrl+c,才会结束。
tail /etc/man_db.conf
//同head,默认也是显示10行。
tail -n +100 /etc/man_db.conf
//只列出100行以后的数据
tail -f /var/log/message
// 持续侦测/var/log/message的内容,直到输入Ctrl+c。特别适用于查看不断有数据写入的log
实战场景,想要显示11到第20行的内容:
head -n 20 /etc/man_db.conf | tail -n 10
// "|"是管线的意思:前面的指令输出的信息,透过管线交给后面的指令继续执行。
// 如果显示1到第20行的内容,并且显示行号
cat -n /etc/man_db.conf | head -n 20 | tail -n 10
6.3.4 非纯文本档:od
查阅非文本文件时,使用od指令。
od [-t TYPE] 文件
TYPE选项可选参数:
- a:利用默认的字符输出;
- @TODO
//将/usr/bin/passwd文件的内容使用ASCII方式展现。
od -t c /usr/bin/passwd
00000000 177 E L
00000020 003 \0
//最左边一栏以8进制表示bytes数。例如:第二栏00000020代表开头是第16个bytes(2*8)的内容之意
od -t oCc /etc/issue
//将/etc/issue文件的内容以8进制列出储存值与ASCII对照表
实战例子,输出passwd几个字的ASCII对照:
echo passwd | od -t oCc
6.3.5 修改文件时间或建置新文件:touch
Linux的文件记录有许多时间参数,主要有三个主要变动时间,分别什么意思呢?
modification time (mtime)
当该文件的[ 内容数据 ]变更时,会更新这个时间。内容数据指的是文件的内容,而不是文件的属性或权限。
status time(ctime)
当该文件的[ 状态 ]改变时,更新这个时间。例如:权限或属性被更改了,会更新此时间。
access time(atime)
当[ 该文件的内容被取用 ]时,会更新这个读取时间(access )。例:使用cat读取/etc/man_db.conf,会更新此时间。
date; ls -l /etc/man_db.conf; ls -l --time=atime /etc/man_db.conf; \ ls -l --time=ctime /etc/man_db.conf
假如发现了一个未来时间的文件,就用touch指令修改。
touch [-acdmt] 文件
//选项与参数见下方
//例1:新建一个空文件并观察时间
cd /tmp
touch testtouch
ls -l testtouch
//touch 后接文件。则此文件三个时间会更新为目前时间。如果不存在,会主动建立一个新的空文件。
//例2:将~/.bashrc 复制成为bashrc 假设复制完全的属性,检查其日期
cp -a ~/.bashrc bashrc
date; ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc
例2中,ll(两个小写L)是[ls -l]意思,本身并不存在,是命令别名。命令别名在bash章节详解。执行完命令就会发现因为是复制过来的所以文件内容时间(mtime)与源文件相同。因为是刚建立的,所以状态(ctime)就成现在时间。
//例3:修改例2中bashrc文件,将日期调整为2天前
touch -d "2 days ago" bashrc
date; ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc
//本来16日改为了14日(atime/ mtime),ctime并没有改变
//例4:将例3的bashrc改为2014/06/15 2:02
touch -t 201406150202 bashrc
date;ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc
//atime与mtime都改变了,但是ctime记录目前的时间。
touch指令最常用的情况是:建立一个空文件;将某个文件日期修订为目前
6.4 文件与目录的默认权限与隐藏权限
除了基本rwx权限外,Linux传统的Ext2/Ext3/Ext4文件系统下,还可以设置其他的系统隐藏属性。使用chattr设定,lsattr查看。最重要的就是设定文件不可修改,在安全机制上面非常常用。但部分distribution利用非Ext文件系统,可能部分功能不支持。
6.4.1文件预设权限umask
umask指令:目前用户在建立文件或目录时的权限默认值。他的指定条件以底下方式来指定:
umask
0022
umask -S
umask,有4组数字。第一组是特殊权限用的,后三个就是u,g,o。
默认情况下,文件目录的权限如下:
- 若使用者建立为文件则预设[没有可执行权限(x)],最大为666分。预设权限如下:-rw-rw-rw-
- 若用户建立为[目录],则由于x与是否可进入此目录有关,因此默认权限均开放,即777分.预设权限如下:drwxrwxrwx
注意:umask的分数指[该默认值需要减掉的权限]。也就是该权限从默认值减去该分数。例如,umask为022:
- 建立文件时》默认权限:(-rw-rw-rw-)》减分数后权限:(-rw-r–r--)
- 建立目录时》默认权限:(drwxrwxrwx)》减分数后权限:(drwxr-xr-x)
umask的利用与重要性:专题制作
假如你和同学在同一部主机里工作,且俩人进行同一个专题,老师建立了相同群组的状态,此时你创建的文件你同学无法编辑。为什么呢?因为umask定为022,新建的数据用户自己有w权限,同群组的人只有r可读权限。此时就要设定umask为002才可以。
umask 002
touch test3
mkdir test4
ll -d test[34]
//[]代表中间有个指定的字符,而不是任意字符的意思。
在默认情况下,root的umask是022,拿走更多权限以保障安全;通常umask建议设为002,即保留同群组写入权利。umask设定可以参考/etc/bashrc文件,但不建议修改此文件。还可以参考第十章bash shell提到的环境参数配置文件。
6.4.2 文件隐藏属性
文件还有隐藏属性,特别在系统安全上有很大帮助。再次强调,chattr指令只能在Ext2/Ext3/Ext4的文件系统上完整生效。
chattr(配置文件隐藏属性)
chattr [+-=] [ASacdistu] 文件
@TODO
//例1:到/tmp底下建立文件,并加入i的参数,尝试删除看看
cd /tmp
touch attrtest
chattr +i attrtest
rm attrtest
//此时连root都无法删除,快解除锁定吧。
//例2:将文件的i属性取消
chattr -i attrtest
这些属性是隐藏性质的,需要lsattr才能看到该属性。最重要的是+i与+a,+i可以让文件无法被更改;对于log文件,更需要+a指令,达到可以增加,但不能修改旧有数据与删除。
lsattr(显示文件隐藏属性)
lsattr [-adR] 文件
chattr +aiS attrtest
lsattr attrtest
使用chattr设定后,可以利用lsattr来查阅隐藏属性。
6.4.3文件特殊权限SUID,SGID,SBIT
ls -ld /tmp; ls -l /usr/bin/passwd
你会发现tmp文件权限有t,passwd文件权限有s。不是只有rwx三种吗?因为s与t的权限意义与系统的账号及系统的程序相关。
Set UID
当s出现在文件拥有者的x权限上时,此时就被称为Set UID,简称SUID的特殊权限。SUID对文件的限制与功能如下:
- SUID权限仅对二进制(binary program)有效;
- 执行者对于该程序需要具有x的可执行权限;
- 本权限仅在执行该程序的过程中有效(run-time);
- 执行者将具有该程序拥有者(ower)的权限。
@TODO
Set GID
Sticky Bit
Sticky Bit,SBIT只针对目录有效。对目录作用是:
- 当用户对于此目录有w, x权限,即具有写入权限时;
- 当用户在该目录下建立文件或目录时,仅有自己与root才有权利删除该文件。
SUID/SGID/SBIT权限设定
6.4.4 观察文件类型file
如果想知道某个文件的基本数据,例如是否属于ASCII,是否有用到动态函数库(share library),就可以利用file指令检查:
file ~/.bashrc
file /usr/bin/passwd
file /var/lib/mlocate/mlocate.db
6.5 指令与文件的搜索
文件的搜索是非常常用的指令。
6.5.1脚本文件名的搜索
which(寻找执行文件)
which [-a] command
//将所有由PATH目录中找到的指令均列出。
//例1:搜索ifconfig指令的完整文件名
which ifconfig
//用which找出which的文件名
which which
//竟然会有两个which,其中一个alias是所谓的命令别名,即输入which等于输入后面一串指令。
//例3:找出history指令的完整文件
which history
//例4:history --help
例3比较有趣,history指令找不到,history是[bash内建指令],但which默认是找PATH内所规范的目录。那怎么办呢?可以使用type指令,具体在第十章看。
6.5.2文件名的搜索
Linux有相当优异的搜索指令。whereis只找系统中某些特定目录底下的文件;locate则是利用数据库来搜索文件名。两则速度相对快,并且没有实际的搜索硬盘内的文件系统状态。如果找不到,可以使用find指令,但速度慢且很费硬盘。
whereis(由一些特定的目录中寻找文件)
whereis [-bmsu] 文件
//例1:找出ifconfig这个文件
whereis ifconfig
//例2:只找出跟passwd有关的说明文件
whereis passwd
//只找出man里面的文件名
whereis -m passwd
whereis可以加入选项来找寻相关数据,比find更常用。
whereis为什么比find快呢?因为whereis只找几个特定的目录,并没有全系统去查。whereis主要针对/bin/sbin底下的执行文件,及/usr/share/man底下的man page等几个特定目录。要知道whereis更具体查找信息,使用whereis确认一下。
locate/updatedb
locate [-ir] keyword
//例1:找出系统中所有与passwd相关的文件名,且只列出5个
locate -l 5 passwd
//例2:列出locate查询所使用的数据库文件之文件名与各数据数量
locate -S
@todo
find
find [PATH] [option] [action]
//例1:将过去系统上面24小时内有更改过内容的文件列出
find / -mtime 0
//0代表目前的时间,所以:从现在到24小时前,有过变动的文件都会列出来。
//如果是三天前的24小时内的:
find / -mtime 3
//例2:找/etc底下的文件,如果日期比/etc/passwd新就列出
find /etc -newer /etc/passwd
//-newer 用在分辨两个文件间的新旧关系