Linux 档案与目录管理

1. 相对路径的妙用

在linux中,只要不是以“/”开头的都是相对路径,如:

cd /tmp/123/a

...

cd /tmp/123/b

..

此时如果要回到文件夹a,则使用命令

cd ../a 即可。这样比较方便

请注意一下路径并非相对路径(假设alex是linux的一个用户):

cd  ~alex/123    -----进入alex用户目录下的123文件夹,虽然不是以“/”开头,但是 ~alex代表的意思是用户alex的家目录,即路径为/home/alex,所以第一个字符还是“/”,因此还是绝对路径,而不是相对路径。

 

思考一下,如果你写了一个软件,包含3个目录,a,b,c   但是有的人喜欢安装在/usr中,有的喜欢安装在/opt中,那你要怎么办呢?当然是使用相对路径了,这样就方便的多了。

不过如果是你的写程序,那么强烈建议使用绝对路径,应为绝对路径虽然相对麻烦一些,但是他绝对正确。

 

2. 目录相关指令。

cd  (chang directory)  变换工作目录。

pwd (print working directory) 输出当前工作目录       pwd -P (输出当前实际工作目录,而非链接文件本身的路径)

# cd /var/mail

# pwd

# pwd -P

 

mkdir  ---建立文件夹

-p  ------递归建立目录。 

如果 mkdir /tmp/123/123/123

mkdir: cannot create directory `test1/test2/test3/test4': No such file or directory <== 没办法直接建立此目录,此时可以:

mkdir -p /tmp/123/123/123

-m ------建立文件夹的同时,直接设定文件夹权限,而非使用umask的默认权限。

mkdir -m 7777 /tmp/123   ----在/tmp下建立123这个文件夹,给予其满权限。

rmdir  ---删除空的文件夹

-p  ------递归删除目录(连同上层所有空目录一起删除,非空则停止)

 

3. 执行文件路径变量PATH

echo $PATH  ----输出path的路径。

如果一个指令被从$PATH的路径中移动到了另外一个非$PATH的路径,而权限并没有变动,那么如果直接执行这个指令就不会成功,因为系统在$PATH中找不到的缘故。

此时可以有两种方法来执行指令:

1. 使用完全路径来执行这个指令。如:/root/ls  -al     ---执行/root目录下的ls这个指令。

2. 将次指令移动后的目录增加到$PATH路径中,时$PATH可以识别它。

# PATH="$PATH":/root

 

4. 复制,移动,删除,重命名。

 复制:cp(copy)

cp  -a  =  cp -pdr  

cp -p  连同档案的属性一起复制(而非使用默认属性),常用于备份。

cp -r  持续递归赋值

cp -d 如果要复制的文件是链接文件(link file),则复制链接文件属性而非档案本身。如果不加-d,则赋值链接文件指向的实际档案。

cp -s 建立一个符号链接文档,相当于windows中的快捷方式。比如:/var/mail 这就是一个链接档。可以观察一下。

cp -l  建立一个实体链接文档,inode会增加1。(实体链接不可以跨文件系统,不是可以使用目录)

如果是一般性的赋值,直接使用cp即可,如果是需要备份,则使用cp -a 即可。

 

rm ---删除(remove)

-f  ---强制性删除文档,忽略不存在的信息,即不出现警告信息。

-r  ---递归删除,常用于删除文件夹。

如果要删除文件夹,可以使用 rm  -rf  xxxx  这样整个世界清净了,不会弹出任何警告信息。。。但是这个删除法很危险,万一误删可就悲剧了。。。。

如果碰到特殊文件要删除的话,可以直接使用标注路径法:如下:

rm -aaa-    ----删除“-aaa-”这个文件。

Try `rm --help' for more information. <== 因为 "-" 是选项嘛!所以系统误判了!

可以使用 rm  --  -aaa-  这个方法删除,也可以使用

rm ./-aaa-    这样指明路径也可以删除。

 

mv  ---移动档案(相当于剪切),更改档案名称。

mv  123.txt   test   将123.txt这个档案剪切到test这个目录。

mv  123.txt  456.txt   将123.txt这个档案更名为456.txt

mv   123.txt  456.txt  test   将123.txt和456.txt这两个档案都移动到test这个目录。

 

basename  ---取得当前档名   如: basename  /root/123.txt  得到 123.txt

dirname      ----取得当前目录名  如:dirname  /root/123.txt  得到/root

 

 5. 档案内容查询,有以下命令。

cat  xxx  猫一下,就可以知道档案中的内容了。如果 cat -n  /etc/fstab   查看档案  /etc/fstab   的内容,并显示行号

tac  xxx  反着猫一下,从最后一行开始倒序显示档案内容。

nl   xxx  显示档案内容并自动加上行号,类似 cat -n  xxx

more  xxx  一页一页的查看档案的内容,但是不能够向上翻页。

less   xxx  类似more的功能,但是可以向上翻页。

head -n  xxx  攫取档案的头几行数据

tail -n  xxx  攫取档案的末尾几行数据

od  xxx 查看二进制数据文件。

 

不过请注意的是,如果使用more或者less来查看文档内容的话,是可以进行搜索的,向下搜索使用“/123”,即可搜素“123”这个字符串,反向搜索使用“?123”。

当使用“/”或者“?”进行搜素的时候,使用n表示继续前一个搜素,使用N表示反向继续前一个搜索。

 

touch  xx   新建空档案。touch 也可以修改已经存在档案的时间属性。如 touch -d "2 days ago" /etc/issue 

 

6. 档案目录的默认权限和隐藏权限。

(1)默认权限

 umask   ----查看档案目录的预设权限(linux中档案默认拿掉x权限)

一般情况下linux中root用户umask一下得到的结果时 0022  普通用户为0002

下边解释一下,其中第一位是特殊权限,即3种,SUID,SGID,SBIT

SUID

查看一下/usr/bin/passwd的属性先, ls -l /usr/bin/passwd 

 显示结果如下    -rwsr-xr-x  1   root root 22984  JAN 7  2007   /usr/bin/passwd

我们发现“/usr/bin/passwd”这个档案的拥有者的可执行权限变了,变成了s,而不再时x了。解释如下:

 

当s这个特殊权限出现在档案拥有者的x权限上时,被称为Set UID权限,建成SUID的特殊权限。

这个权限的意义在于:

1. SUID权限仅仅对二进制文件有效。

2. 此权限在执行者执行期间有效(run-time)

3. 执行者需要有此文件的x权限。

4. 执行者在执行此程序过程中将拥有该程序拥有者的权限。

如果不理解这个概念的话,可以看一下 /usr/bin/passwd 这个执行档就明白了。

#passwd 是修改用户密码的意思。 但是我们可以看到 /etc/shadow 这个档案的拥有者为root 并且只有root可以读并且强制写入。但是我们每个用户运行passwd还是可以修改自己的密码,即可以更改/etc/shadow这个档案,这就是SUID的功劳了。。。

 

SGID  类似于SUID 只不过,SUID在owner的x权限上,而SGID出现在group的x权限上。

 

SBIT  查看一下 /tmp  这个目录的权限即可知道。

1. SBIT 只对目录有效。

2. SBIT 出现在others的x权限上。以t表示。(SUID和SGID都是以s表示的)

2. SBIT 权限的目录,如果用户有此目录的写入和执行权限的话(w和x),该用户建立的档案只有用户自己和root才能删除,其他人是不可以删除的。

如果按照rwx的分数来对照的话,SUID,SGID,SBIT的分数分别为4,2,1   代号为s,s,t

可以使用数字发赋予权限,也可以使用增减法赋予,如下:

chmod 4777 /root/123.txt  给123.txt 满权限,并且加上SUID的特殊权限。

chmod u-s  /root/123.txt 将123.txt的SUID权限拿掉。

回过头来,umask的第一位指的就是这3个特殊权限,预设为0,即没有任何特殊权限。

 

umask的后3位就比较容易理解了。

是建立目录或者档案时需要去掉的权限,比如root用户为0022,也就是说如果root用户建立一个目录的话,默认没有任何特殊权限,owner具有全部权限,group具有r和x权限,other也具有r和x权限 即为:  -rwxr-xr-x 

由于档案默认没有执行权限,所以root用户建立档案的默认权限为 -rw-r--r--

如果想要改变umask的默认值,设定方式为 umask = 0022

 

(2)隐藏权限和属性

除了(1)中所讲的权限以外,linux中还有一些隐藏的权限和属性,这些属性需要使用chattr来修改。

chattr  +a  /etc/login   给/etc/login这个档案加上特殊权限,此档案任何用户都不能修改,删除,只能增加内容。(如果要取消这个属性,chattr -a  /etc/login   即可)

chattr  +i   /etc/login    给/etc/login这个档案加上特殊权限,此档案任何用户都不能修改,删除和增加如何内容。(如果要取消这个属性,chattr -i  /etc/login   即可)

这两个属性只有root用户可以设定。

查看一个档案的属性,可以使用lsattr 

lsattr   /etc/login    显示档案/etc/login的隐藏属性。

 

7. 观察查文件的类型。

file  /root/123.txt  查看/root/123.txt  这个档案时何种档案类型?(二进制的?纯文本的?......)

 

8. 指令或者档案的搜索。

whatis ls  查找ls这个执行在man文档中的位置。(可查任何东西,比如档案或者指令,只要man文档中有的,并且查找范围只在man文档)

which  ls   在用户的PATH中查找执行档的所在位置(只能查找执行档案,并且只在用户的PATH中查找)

whereis  issue  查找档案issue所在的位置(whereis是直接查找档案数据库的,而不是遍历磁盘的,所以速度比较快,但是并不保证时最新的)

locate  issue  查找档案issue所在的位置(和whereis 类似,但为部分匹配,并且查的档案类型比whereis 多)

由于执行whereis和locate的时候是在数据库“/var/lib/mlocate/mlocate.db”中寻找,而此数据库时一天更新一次(不同的distribution不一样的),所以会出现搜索到已经删除的档案,或者新建的档案无法搜索到。此时可以使用指令 updatedb来手动更新档案数据库。

updatedb,根据/etc/updatedb.conf的设定搜寻系统硬盘内的文件名,并更新/var/lib/mlocate/mlocate.db    此指令会消耗一定的时间。

 

find   

find是一个非常强大的指令。可以搜索的东西非常全面。但是find是比较耗时的,因为find是搜索硬盘而非数据库的。

find  PATH  OPTION  ACT

 

-mtime n :n 为数字,意义为在 n 天之前的『一天内』被更改过内容的档案;

find  /  -mtime 1   ----在“/”目录中搜索所有在1天之前的一天内更改过内容的档案(即昨天更改过的)。

 

-mtime +n :列出在n 天之前(不含n 天本身)被更改过内容的档案档名;

find / -mtime +1   ----在“/”目录中搜索所有在1天之前(不含1天本身)更改过内容的档案(即昨天以前,不包含昨天)。

 

-mtime -n :列出在 n 天之内(含n 天本身)被更改过内容的档案档名。

find / -mtime -1   ----在“/”目录中搜索所有在1天之内(含1天本身)更改过内容的档案(即24小时之内)。

 

-newer file :file 为一个存在的档案,列出比 file 还要新的档案档名

find /  -mtime  /root/123.txt  ----列出比/root/123.txt  的日期还要新的档案。

 

-user  NAME  列出属于NAME这个user的档案

find  /tmp -user  uncle_cat   列出“/tmp”目录下,所有拥有者为uncle_cat的档案。

 

-group  NAME  列出属于NAME这个group的档案

find  /tmp -group  uncle_cat   列出“/tmp”目录下,所有为uncle_cat这个群组的档案。

 

-nouser  寻找档案拥有者不存在的档案。

-nogroup  寻找没有所属群组的档案。

 

-name  NAME    列出档案名称为NAME的档案

-size  +N(k/m:大小的单位,k为kbytes,M为Mbytes),如

find  / -size -5k   找出系统中小于5k的档案。

find /  -size +10M  找出系统中大于10M的档案。

 

-type  X  列出档案类型为X的档案,如:(f:正规档案,b,c:装置档案,d:目录,l :链接档。。。。。。)

find /  -type  b  -o -type c  找出系统中档案类型为b或者c的档案(-o 的意思是或者,即or ,同理 and 为 -a )

find /  -type f -a  -size +10M -exec ls -l {} \;  找出系统档案中类型为f,并且大小大于10M的文档,同时输出到屏幕上。 (注意,find可以跟-exec 来执行附带功能。)

(1){} 代表的是『由 find 找到的内容』,find 的结果会被放置到 {} 中;

(2)-exec 一直到 \; 是关键词,代表 find 额外动作的开始 (-exec) 到结束 (\;) ,在这中间的就是 find 指令内的额外动作。 在本例中就是『 ls -l {} 』

(3)因为『 ; 』在 bash 环境下是有特殊意义的,因此利用反斜杠来跳脱。

 

-perm  mode   列出权限刚好等于mode的档案,如:

find /  -perm 4755   列出系统中权限刚好为4755的档案。

 

-perm  -mode  列出系统中权限完全包含mode的档案。  比如mode=4755时,4777包含了所有的4755,所有4777就会被列出来

-perm  +mode  列出系统中权限包含于mode的档案。  比如mode=4755时,2744包含于4755,所有2744就会被列出来

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值