Linux文件和目录管理


一.目录与路

1.绝对路径与相对路径

绝对路径:路径的写法[一定由根目录 / 写起],例如: /usr/share/doc 这个目录。

相对路径:路径的写法[不是由 / 写起],例如由 /usr/share/doc 要到 /usr/share/man 底下时,可以写成:[cd ../man] 这就是相对路径的写法啦!

.     代表此层目录
..    代表上层目录
~     代表自己的家目录
~user 代表到 user 这个人的家目录

2. cd  [改变工作路径]
语法:

[root @test /root ]# cd [相对路径或绝对路径] 
参数说明:
路径有『相对路径』与『绝对路径』的分别,请千万小心啰!
范例:
[root @test /root]# cd..              回到上一层目录
[root @test /root]# cd ../home        相对路径的写法
[root @test /root]# cd /var/www/html 绝对路径的写法
[root @test /etc]# cd          回到使用者的家目录
[root @test /etc]# cd~                回到使用者的家目录!
[root @test /etc]# cd~test            回到 test 这个使用者的家目录

说明:
注意,路径与 cd 指令之间存在一个空格!一登入 Linux 系统后,root 会在 root 的家目录,亦即 /root 下,至于使用者会在预设的/home/username 底下。

3. pwd  [显示目前所在目录]
语法:

[root @test /root ]# pwd 
范例:
[root @test root]# cd /home/test
[root @test test]# pwd 
/home/test            <==显示目前你所在的目录呦!

说明:
pwd 是 print working directory 的缩写,也就是显示目前所在目录的指令,例如在上个表格最后的目录是 /home/test 这个目录,但是提示字符仅显示 test ,如果你想要知道目前所在的目录,可以输入 pwd 即可。
此外,由于很多的套件所使用的目录名称都相同,例如 /usr/local/etc 还有 /etc ,但是通常 Linux 仅列出最后面那一个目录而已,这个时候你就可以使用 pwd 来知道你的所在目录啰!免得搞错目录,结果……

4. mkdir  [建立新的目录]
语法:

[root @test /root ]# mkdir [-mp] [目录名称]
参数说明:
-m :设定目录的权限喔!直接设定,不需要看 umask 这个内容的脸色!
-p :帮助你直接将上面的目录递归建立起来!
范例:
[root @test /root]# cd tmp
[root @test /tmp]# mkdir test <==建立名称为 test 的目录

[root @test /tmp]# mkdir -p test1/test2/test3/test4 <==直接建立test2...等上层目录

[root @test /tmp]# mkdir -m 711 testqq  <==建立权限为 711 的目录!
[root @test /tmp]# ll test*
drwxrwxr-x    2 test   test        4096 Feb  6 20:47 test/
drwxrwxr-x    3 test   test        4096 Feb  6 20:48 test1/
drwx--x--x    2 test   test        4096 Feb  6 20:48 testqq/

说明:
如果想要建立新的目录的话,那么就使用 mkdir 吧! 不过,请注意呦!在预设的情况下,你所需要的目录得一层一层的建立才行!例如:假如你要建立一个目录为 /home/bird/testing/test1,那么首先必须要有/home 然后 /home/bird ,再来 /home/bird/testing 都必须要存在,才可以建立test1 这个目录!假如没有 /home/bird/testing 时,就没有办法建立test1 的目录啰!不过,现在有个更简单有效的方法啦!那就是加上 -p 这个参数喔!你可以直接下达:[ mkdir -p/home/bird/testing] 则系统会自动的帮你将 /home, /home/bird, /home/bird/testing 依序的建立起目录!并且,如果该目录本来就已经存在时,系统也不会显示错误讯息喔!

5. rmdir [删除旧的目录]
语法:

[root @test /root ]# rmdir [-p] [目录名称]
参数说明:
-p :将上层的目录也删除吧!
范例:
[root @test /root]# rmdir test     <==删除名称为 test 的目录
[root @test tmp]# ll
drwxrwxr-x   3 test    test        4096Feb  6 20:48 test1/

[root @test tmp]# rmdir test1
rmdir: `test1': Directory not empty

[root @test tmp]# rmdir -ptest1/test2/test3/test4
[root @test tmp]$ ll
说明:

如果想要建立删除旧的目录时,就使用 rmdir 吧!例如将刚刚建立的 test 删除,使用 rmdir test 即可!请注意呦!目录需要一层一层的删除才行!而且被删除的目录里面必定不能还有其它的目录或文档那如果要将所有目录下的东西都删除呢?!这个时候就必须使用 rm -rf test 啰!不过,还是使用 rmdir 比较不危险!不过,你也可以尝试以-p 的参数加入,来删除上层的目录喔!

6. 环境变量 PATH
在提过了绝对路径、相对路径与指令的下达方式之后,您应该会稍微注意到一件事情,那就是: [为什么我可以在 /root 底下执行 /bin/ls 这个文档呢?]对呀!为什么我可以直接执行 ls 就一定可以显示出一些讯息而不会说找不到该档案呢?这是因为环境变量 PATH 的帮助所致呀! 当我们在执行一个指令的时候,系统会依照 PATH 的设定去每个 PATH 定义的路径下搜寻档案,先搜寻到的指令档案先被执行之!现在,请下达 echo $PATH , echo 有 [显示、印出] 的意思,而 PATH 前面加的 $ 表示后面接的是变量,所以即会显示出目前的 PATH 了! 
[root@test root]# echo $PATH
/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin

注意到了吗?对啦! /bin 在 PATH 的设定之中,所以自然就可以找的到 ls 啦!

如果你将 ls 移动到 /root 底下的话,然后你自己本身也在 /root 底下,但是当你执行 ls 的时候,他就是不理你?怎么办?这是因为 PATH 没有 /root 这个目录,而你又将 ls 移动到 /root 底下了,自然系统就找不到可执行文件了,因此就会告诉你, command not found !那么该怎么克服这种问题呢?有两个方法,其一:直接将 /root 的路径加入 PATH 当中!

如何增加?可以使用:PATH=”$PATH”:/root
这种方式来增加即可!另一种方式则是使用完整档名,亦即直接使用相对或绝对路径来执行,例如:

 /root/ls
 ./ls

因为在同一个目录中,而我们又知道在同一个目录中的目录符号为 [ . ],因此,就以上面的 ./ls 来执行也可以!这种执行方式以后您应该会很常见到才对!

如果我有两个 ls 档案在不同的目录中,例如 /usr/local/bin/ls 底下与 /bin/ls 那么当我下达 ls 的时候,那个 ls 会被执行?那还用说,就找出 PATH 里面那个目录先被查询,则那个目录下的档案就会被先执行了!

咦!既然如此的话,那么为何不要在 PATH 里面加入 . 这个目录,如此一来的话,不就可以直接在所在目录执行档案了吗?因为 . 代表所在目录嘛!是这样没错!但是有没有想过,如果某天,某个怪怪的使用者在 /tmp里面写了一个ls 的档案,偏偏他是有害的档案,那么当你在 /tmp 底下执行 ls 时,怎么办?!没错,可能会 [中标],所以啰,为了安全起见,不建议将[ . ]加入 PATH 的搜寻当中

二. 管理文件和目录

1. ls  [查看文件和目录]
语法:

[root @test /root ]# ls [-ailS] 
参数说明: 
-a       :全部的文件都列出,连同隐藏文件(开头为.的文件) 
-i       :列出 inode 的值 
-l       :列出长数据串,连同文件大小的数据等等 
-S       :以文件大小排序 
--color=never     :不要显示颜色 
--color=always    :均显示颜色 
--color=auto      :由系统自行判断! 

范例: 
[root @test /root]# ls -al 
total 48 
drwxr-x---    4 root     root         4096 Mar 10 00:37 . 
drwxr-xr-x   21 root     root         4096 Mar 10 20:16 .. 
-rw-------    1 root     root          524 Mar 10 00:40 .bash_history 
-rw-r--r--    1 root     root           24 Jun 11  2000 .bash_logout 
-rw-r--r--    1 root     root          266 Jun 11  2000 .bash_profile 
-rw-r--r--    1 root     root          249 Mar  6 20:50 .bashrc 
-rw-r--r--    1 root     root          210 Jun 11  2000 .cshrc 
drwx------    2 root     root         4096 Mar  9 11:06 .gnupg 
-rw-------    1 root     root          524 Jan 16 14:37 .mysql_history 
drwx------    2 root     root         4096 Mar  9 11:06 .ssh 
-rw-r--r--    1 root     root          196 Jul 11  2000 .tcshrc 
-rw-r--r--    1 root     root         1126 Aug 24  1995 .Xresources 

[root @test /]# ls 
bin   dev    etc   lib         misc  opt   root  tftpboot  usr 
boot  disk1  home lost+found  mnt   proc  sbin tmp       var

[root @test /]# ls --color=never 
bin   dev    etc  lib         misc  opt  root  tftpboot  usr 
boot  disk1  home  lost+found  mnt  proc  sbin  tmp       var 

[root @test /]# ls -al|more

说明:
通常我们都需要知道这个文件名称 [目录] 还是 [文件] ?所以,我都喜欢使用 [ ll ]这个指令,其实那就是ls -l的意思啦!不论如何,你都可以尝试着执行这之指令来视察你的文件!
另外,如果在远程以 telnet 或者是 putty 的联机程序登入主机的时后,由于 Linux 预设使用有颜色的方式显示方式,蓝色的字样根本就是很难看到!这个时候通常我都是使用『ls --color=never 』来丢掉颜色!那如果想让 ls 预设没有颜色的话,可以在 /root/.bashrc或者是你的家目录的.bashrc 这个文件中加入下面这一行:

alias ls='ls--color=never' 这样就可以把颜色去到了!

通常,蓝色显示目录,白色显示普通文件。

2. cp [拷贝文件或目录]
语法:

[root @test /root ]# cp [-drsu] [来源文件] [目的文件] 
参数说明: 
-d         :在进行 copy 的时候,如果是 copy 到 link 文件,
若不加任何参数,则默认情况中会将 link 到的源文件 copy 到目的地,
若加 -d 时,则 link 文件可原封不动的将 link 这个快捷方式其拷贝到目的地! 
-r         :递归复制,可以进行目录的 copy ! 
-s         :复制成连结文件,而不 copy 之意!与 ln 指令相同功能! 
-u         :若目标文件比源文件旧,更新目标文件。 
-i         :若目标文件已存在,覆盖时会询问。
-f         :强制复制

范例: 
[root @test /root]# cp    .bashrc bashrc      <==将 .bashrc 拷贝成 bashrc 这个文件! 

[root @test /root]# cp -r /bin /tmp/bin        <==这是用来 copy 整个目录! 

[root @test /root]# cp -s .bashrc bashrc         <==将 .bashrc 建立一个连结文件,文件名为 bashrc 

[root @test /root]# cp -u /home/.bashrc .bashrc  <==先检查 /home/.bashrc 是否与 .bashrc 不同,
如果不同的话就开始 copy 一份!如果相同则不做任何动作!

说明:
这个指令会常用到的,因为我们得常常需要 copy 资料呀!所以需要了解一下喔!如果你有些很大文件的需要备份,偏偏这个文件的更新率很低,那么每次备份都需要在 copy 一份吗?看来是不需要了!你可以使用 [cp -u 来源文件 目的文件] 来备份呦!如此一来,当文件被改变过后,才会进行 copy 的动作!

3. rm [删除文件或目录]
语法:

[root @test /root ]# rm [-fir] [文件或目录] 
参数说明: 
-i     :交互模式,在删除前会询问用户是否操作(默认) 
-r     :递归删除。常用在目录的删除。 
-f     :force ,就是强力删除! 

范例: 
[root @test /root]# cp .bashrc bashrc   <==建立一个新文件, bashrc 
[root @test /root]# rm bashrc           <==会显示如下的提示: 
rm: remove `bashrc'? 
[root @test /root]# mkdir testing 
[root @test /root]# cp .bashrc testing 
[root @test /root]# rmdir testing 
rmdir: `testing': Directory not empty   <==由于 testing 里面有 .bashrc ,所以删除不掉! 

[root @test /root]# rm -rf testing      <==坚持删除该目录下的所有文件与目录

说明:
这是删除指令,相当于 dos 下的 del 指令!这里要注意的是,通常在 Linux 系统下,为了怕档案被误删,所以都已经有-i 这个参数, -i 是指每个文件被删除之前都会让使用者确认一次,以预防误杀档案!而如果要连目录下的东西都一起杀掉的话,例如子目录里面还有子目录时,那就要使用 -rf 这个参数了!不过,使用『rm -rf』这个指令之前,请千万注意了,因为,该目录或文档 [肯定] 会被 root 杀掉因为系统不会再次询问你是否要删除!所以那是个超级严重的指令!得特别注意!不过,如果你确定该目录不要了,那么使用 rm -rf 来循环删除是不错的方式!

4. mv [移动文件与目录,或重命名]
语法:

[root @test /root ]# mv [-fiu] [来源] [目的] 
参数说明: 
-f   :强制直接移动,不会询问
-i   :若目标文件已存在,会询问
-u   :同样的,为 update 的简写,当来源文件比目的文件还新的时后才会动作! 

范例: 
[root @test /root]# cp ~/.bashrc bashrc //复制一个文件
[root @test /root]# mkdir mvtest        //建立一个目标
[root @test /root]# mv bashrc mvtest    //将文件移动到目录 

[root @test /root]# mv mvtest mvtest2   //将目录重命名

[root @test /root]# mv bashrc1 bashrc2 mvtest2
//将 bashrc1 与 bashrc2 移动到 mvtest2 这个目录下!请注意,最后一个才是最终的目标,其它的都是 SOURCE

5. basename [取出最后的文件或目录名]
语法:

[root @test /root ]# basename [目录] 

范例: 
[root @test /root]# basename /usr/local/etc 
etc 
这个指令会取出[目录]最后面的那个目录或文件的名子, 
以上面的例子来看, /usr/local/etc 不论 etc 是目录或文件, 
他都会被取出来,因为他是最后一个出现的咚咚!

6.  dirname [取出最后文件之前的名子]
语法:

[root @test /root ]# dirname [目录] 

范例: 
[root @test /root]# dirname /usr/local/etc 
/usr/local 
他取出etc前面的部分!

三.查看文件内容:

如果我们要视察文件的内容时,该如何是好呢?!最常使用的显示文件内容的指令可以说是 cat 与 more 及 less 了!此外,如果我们要查看一个很大型的文件(好几百MB时),但是我们只需要后端的几行字而已,那么该如何是好?呵呵!用tail 呀,此外, tac 这个指令也可以实现!

1. cat [从第一行开始显示文件内容]
语法:

root @test /root ]# cat [-nAE] 
参数说明: 
-n:   显示行号 
-A:   将 <tab> 与换行字符都列出来!
-E:   将结尾的换行字符$显示出来! 

范例:
[root @test /root]# cat~/.bashrc         <==显示 .bashrc 这个文件 
# .bashrc 
# User specific aliases and functions 
PATH="/bin:/sbin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:$PATH" 
alias rm='rm -i' 
alias cp='cp -i' 
alias mv='mv -i' 
alias ll='ls -l --color=never'

[root @test /root]# cat~/.bashrc -n      <==显示 .bashrc 并且加上行号! 
     1 # .bashrc 
     2
     3  # User specific aliases andfunctions 
     4 PATH="/bin:/sbin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:$PATH" 
     6  alias rm='rm -i' 
     7  alias cp='cp -i' 
     8  alias mv='mv -i' 
     9  alias ll='ls -l --color=never' [root @test /root]# cat -A regexp.txt 
This is a cat, however, I need a dog.^M$ 
I want to "Happy" and <Happy> and /Happy/ here.^M$ 
OK! ^Ieverythins is OK^M$ 

可发现 ^M 为换行符号,而每行的$ 为行尾符号, 
至于 ^I 则是<tab> 按键啦! 

说明:
cat 是 Concatenate (连续)的简写,主要的功能是将一个文件的内容连续的显示在屏幕上面!cat 比较少用!毕竟当你的文件内容的行数超过40 行以上,根本来不及看!所以,配合 more 或者是 less 一起使用会更好一点!

2. tac [从最后一行开始显示,可以看出 tac 是 cat 的倒着写]
语法:

[root @test /root ]# tac [文件名] 
 
范例: 
[root @test /root]# tac ~/.bashrc <==发现了没?反向印出呦! 
fi 
        . /etc/bashrc 
if [ -f /etc/bashrc ]; then 
# Source global definitions 
alias h='history' 
alias lm='ls -al|more' 
alias ll='ls -l' 
# alias ll='ls -l --color=never' 
alias mv='mv -i' 
alias cp='cp -i' 
alias rm='rm -i' 
export PATH 
PATH="/bin:/sbin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:$PATH" 
# User specific aliases and functions 
# .bashrc

说明:
cat 与 tac ,有没有发现呀!对啦!tac 刚好是将 cat 反写过来,所以他的功能就跟 cat 相反啦, cat 是由『从一行到最后一行连续显示在屏幕上』,而 tac 则是『从最后一行到第一行反向在屏幕上显示』!

3. more [一页一页的显示文件内容]
语法:

[root @test /root ]# more [文件名] 
 
范例: 
[root @test /root]# more ~/.bashrc  <==一页一页的显示文件内容 
[root @test /]# ls -al | more  <==一页一页的将 ls 的内容显示出来

说明: 

空格键:向下翻一页。

Enter:向下翻一行。

/字符串:向下搜索"字符串"。

:f:立刻显示文件名以及当前显示的行数。

q:离开more。

4. less与 more 类似,但是比more 更好的是,他可以往前翻页
语法:

[root @test /root ]# less [文件名]  
 
范例:  
[root @test /root]# less ~/.bashrc 

说明:

空格键:向下翻一页。

/字符串:向搜索"字符串"。

?字符串:向搜索"字符串"。

[pagedown]:向下翻动一页。

[pageup]:向上翻动一页。

q:离开less。

less 的用法比起 more 更灵活。在more 的时候,我们并 没有办法向前面翻,只能往后面看,但若使用了 less 时,呵呵!就可以使用 [pageup] [pagedown]等按键的功能来往前往后翻看文件。
more 与 less 的用途与用法真的是很广啦!首先,你可以在 more 与less 的画面中进行『搜索』的工作!如何进行呢?我们以 less 来说明好了,如果你想要知道/etc/man.config 这个文件里面有没有一个叫做GER 的大写字眼,那么可以:
[root @test /root ]# less /etc/man.config  

按键说明: 
/word:在 /etc/man.config 这个文件中搜寻 word 这个字符串的所在 
q    :离开 less 的画面

然后在输入 / 之后,光标会移动到最左下角等待输入,这个时候您只要输入你的字符串之后,就会自动的帮你找出来该关键词啰!

5. head [只看头几行]
语法:

[root @test /root ]# head [-n number] [文件] 
参数说明: 
-n :表示显示几行的意思

范例: 
[root @test /root]# head ~/.bashrc        <==默认,显示头十行 
[root @test /root]# head -n 20 ~/.bashrc  <==显示头二十行!

说明:
head 的英文意思就是『头』啦,那么这个东西的用法自然就是显示出一个文件的前几行啰!没错!就是这样!若没有加上 -n 这个参数时,默认只显示十行,若只要一行呢?那就加入『 head -n 1 filename』即可!

6. tail [只看尾巴几行]
语法:

[root @test /root ]# tail [-n number] [文件] 
参数说明: 
-n :显示 number 行 

范例: 
[root @test /root]# tail ~/.bashrc 
[root @test /root]# tail -n 5 ~/.bashrc <==只显示最后面五行!
说明:
那么有 head 自然就有 tail ( 尾巴 ) 啰!没错!这个 tail 的用法跟 head 的用法差不多类似,只是显示的是后面几行就是了! 默认也是显示十行,若要显示非十行,就加 -n number 的参数! 

7. nl [显示的时候,顺序输出行号]
语法:

[root @test /root ]# nl [文件] 
 
范例: 
[root @test /root]# nl ~/.bashrc

说明:
那么nl 也就是 [可以印出行号] 的指令来查看文件啦!

8. od [以二进制的方式读取文件内容]
语法:

[root @test /root ]# od [文件] 
 
范例: 
[root @test /root]# od ~/.bashrc 
0000000 020043 061056 071541 071150 005143 021412 052440 062563 
0000020 020162 070163 061545 063151 061551 060440 064554 071541 

说明:
好了,那么如果有一个非 ASCII 的数据文件呢?例如那个 binary 的档案!使用 vi 根本就是看不着~这个时候看来只有使用将整个数据以数值方法读出来啦!那就是 od 这个指令来读出来呦!这个东西可以用来输出该数据为十进制、16进位等等的数据格式!不过这个东西对于工程师可能比较有用啦!

四.搜索文件

1. which (搜索“执行文件”)
语法: 

[root @test /root ]# which [-a] command 
参数说明: 
-a : 将所有可找到的命令均列出,而不仅仅列出第一个找到的命令名称

范例: 
[root @test /root]# which passwd 
/usr/bin/passwd
说明
which 的基本功能是 [根据 PATH 这个环境变量的内容,去该路径内寻找可执行文件的文件名],重点在于[找出执行文件 ] 如果执行文件不在环境PATH路径下,是找不出来的

2.whereis (搜索特定文件)
语法:

[root @test /root ]# whereis [-bmsu] [文件或目录名称] 
参数说明: 
-b    :只找 binary 的文件 
-m    :只找在帮助文件 manual 路径下的文件
-s    :只找 source 来源的文件
-u    :没有帮助文件的文件! 

范例: 
[root @test /root]# whereis passwd 
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.bz2 
将 passwd 相关字眼的文件或目录都列出来! 

[root @test /root]# whereis -b passwd 
passwd: /usr/bin/passwd /etc/passwd 
仅列出binary 文件! 

[root @test /root]# whereis -m passwd 
passwd: /usr/share/man/man1/passwd.1.bz2 
仅搜寻 man page 所在的目录!
说明
那么 whereis 到底是使用什么呢?为何搜寻的速度会比 find 快这么多?!其实那也没有什么!这是因为 Linux 系统会将系统内的所有文件都记录在一个数据库文件里面,而当使用 whereis 或者是底下要说的 locate 时,都会以此数据库文件的内容为准,因此,有的时后你还会发现使用这两个执行文件时,会找到已经被删除的文件,而且也找不到刚刚建立的最新文件!这就是因为他是通过 [数据库]中的结果来搜索的呀!另外,基本上 Linux 每天会针对 Linux 主机进行 updatedb (就是那一个数据库档案啰!)的动作。

你可以直接使用 /usr/bin/updatedb 来更新数据库文件呢!
3. locate
语法: 

[root @test /root ]# locate [文件的部分名称] 
 
范例: 
[root @test /root]# locate root 
……一大堆跟 root 有关字眼的文件都出来了 @_@ 
[root @test /root]# updatedb        <==立刻更新数据库
说明

locate 的使用方式就更简单了!直接键入你要找的文件的部分名称即可!但是,这个东西还是有使用上的限制呦!为什么呢?您会发现使用 locate 来寻找数据的时候特别的快,这是因为 locate 寻找的数据是由 [已建立的数据库 /var/lib/slocate]里面的数据所搜寻到的,所以不用直接在去硬盘当中存取数据,呵呵!当然是很快速啰!那么有什么限制呢?就是因为他是经由数据库来搜寻的,而数据库的建立预设是在每个礼拜执行一次,所以当您新建立起来的文件,却还在数据库更新之前搜寻该文件,那么 locate 会告诉您 [找不到!] 呵呵!因为必须要更新数据库!

4.find

语法: 
[root @test /root ]# find [路径] [参数] 
参数说明: 
1. 与时间有关的参数: 
   -atime n    :在 n*24 小时内被 access 即存取过的文件
   -ctime n    :在 n*24 小时内被 changed 即改变、新增的文件或目录
   -mtime n    :在 n*24 小时内被 modified 即修改过的文件
   -newer file :比 file 还要新的文件就列出来! 

2. 与用户或用户组名称有关的参数: 
   -gid n      :寻找 群组 ID 为 n 的文件 
   -uid n      :寻找拥有者 ID 为 n 的文件
   -group name :寻找群组名称为 name 的文件   
   -user name  :寻找使用者名称为 name 的文件

3. 与文件名称及权限有关的参数:
   -name file  :寻找文件名为 file 的文件名称(可以使用万用字符) 
   -type TYPE  :寻找文件属性为 TYPE 的文件,TYPE 包含了 b, c, d, p, l, s, 

范例: 
[root @test /root]# find / -name testing            <==寻找档名为 testing  

[root @test /root]# find / -name 'test*'       <==寻找文件名包含 test 的! 

[root @test /root]# find . -ctime 1                 <==寻找目前目录下一天内新增的目录或文件 

[root @test /root]# find /home/test -newer .bashrc  <==寻找 /home/test 目录下比 .bashrc 还要新的文件 

[root @test /root]# find /home -user test       <==寻找 /home 底下拥有者为 test 的文件

[root @test /root]# find /dev -type b               <==寻找 /dev 这个目录下,档案属性为 b 的文件
说明
如果你要寻找一个文件的话,那么使用 find 会是一个不错的主意!他可以根据不同的参数来给予文件的搜寻功能!例如你要寻找一个档名为 httpd.conf 的文件,你知道他应该是在 /etc 底下,那么就可以使用 [
find /etc -name httpd.conf ] !那如果你记得有一个文件名包含了 httpd ,但是不知道全名怎办?!呵呵,就用万用字符 * 吧,如上以:[ find /etc -name '*httpd*' ] 就可将文件名含有 httpd 的文件都列出来啰!不过,由于 find 在寻找数据的时后相当的耗硬盘!所以没事情不要使用 find !

五.文件与目录权限

1. chown (改变文件或目录的拥有人)
语法:

[root @test /root ]# chown [-R] user:group [文件或目录名称] 
参数说明: 
-R    :循环的将该目录下的所有文件属性都改成 user 与 group 所有! 

范例: 
[root @test /root]# mkdir /home/test/testing  <==在 /home/test 这个家目录中建立一个名为 testint 的子目录 
[root @test /root]# cp * /home/test/testing 
[root @test /root]# chown test /home/test/testing 
[root @test /root]# chown -R test:test /home/test/testing <==将该目录下的所有目录或文件均变为 test 拥有
说明
刚接触 Linux 的朋友最容易犯的一个错误在哪里呢?就是以 root 的身份 copy 一个文件(或路径)给一般使用者(假设为 test )时,忘记将该文件的所有人改成 test 了!由于复制者是 root 所以该文件也会是 root 所有!那么 test 当然也就不能修改该文件了!
在上面的例子中,[
chown test /home/test/testing ] 这个指令只会将该目录变成 test 的,但是 group 仍然是 root 的呦!所以你可以使用 [chown test:test /home/test/testing ],连使用者群组都给他改变一下啰!不过需要注意的是,这两个指令都只改变了[目录]的所有权而已!那么在这个目录下的东西也要改变的话,该如何?!呵呵,就使用 -R 这个参数即可!
2. chmod (改变文件的rwx属性)
语法:
[root @test /root ]# chmod [-R] [parameter] [目录名称] 
参数说明: 
-R   :循环的一直将该目录的文件均改变! 

范例: 
[root @test /root]# chmod 777 .bashrc 
说明
一个文件或目录至少有九个属性,三个三个一组,共分为三组!而可以使用数字来当作变换属性的参考依据!各属性如下:

r:4 可读

w:2 可写

x:1 可执行

举个例子来说,当一个属性为『-rwxr-xr--』时,那是几分呢?!我们可以将他看成如下『-[rwx][r-x][r--]』三组,分别是[拥有人权限群组权限其它非本组权限],所以分数就变成了『[4+2+1][4+0+1][4+0+0]』共有『754』分啦!

所以,如果你要将 .bashrc 设定成所有人都可以读取的话,就下达『chmod 777 .bashrc 』吧!
3.  umask (文件或目录的默认属性)
umask 就是指定『当前用户在建立文件或目录时的属性默认值』,那么如何得知或设定 umask 呢?他的指定条件以底下的方式来指定:
语法: 

[root @test root]# umask    //查看当前用户的默认权限
0022 

[root@vbird test]# umask -S //查看当前用户的默认权限
u=rwx,g=rx,o=rx 

[root@vbird test]# umask 002 //设置默认权限
说明  

umask 指定的是『该默认值需要减掉的权限!』因为 r、w、x 分别是 4、2、1 !

如果以上面的例子来说明的话,因为 umask 为 002 ,所以 user, group 并没有被拿掉属性,不过 others 的属性被拿掉了 2 ( 也就是 w 这个属性 ),那么由于当使用者:
建立文件时:(-rw-rw-rw-) – (--------w-) ==> -rw-rw-r--  注:(默认文件是没有可执行x权限)

建立目录时:(drwxrwxrwx) – (--------w-) ==> drwxrwxr-x  注:(默认目录权限均开放)

4. chattr(设置文件隐藏属性)
语法: 
[root @test /root ]# chattr [+-=][ASacdistu] [文件或目录名称] 
参数说明: 
+-= :分别为 [+ 增加] [- 删除] [= 设定] 某个特殊属性
A  :当设定了 A 这个属性时,这个文件(或目录)的存取时间 atime (access) 将不可被修改, 
    可避免例如手提式计算机容易有磁盘 I/O 错误的情况发生! 
S  :这个功能有点类似 sync 的功能!就是会将数据同步写入磁盘当中!可以有效的避免数据流失! 
a  :当设定 a 之后,这个文件将只能增加数据,而不能删除,只有 root 才能设定这个属性。 
c  :这个属性设定之后,将会自动的将此文件『压缩』,在读取的时候将会自动解压缩出来! 
    但是在储存的时候,将会先进行压缩之后再储存(看来对于大文件似乎蛮有用的!) 
d  :当 dump (备份)程序被执行的时候,设定 d 属性将可使该文件(或目录)具有 dump 功效! 
i  :这个 i 可就很厉害了!他可以让一个文件『不能被删除、改名、设定连结也无法写入或新增数据!』 
    对于系统安全性有相当大的帮助! 
j  :当使用 ext3 这个文件系统格式时,设定 j 属性将会使文件在写入时先记录在 journal 中! 
    但是当 filesystem 设定参数为 data=journalled 时,由于已经设定了日志了,所以这个属性无效! 
s  :当文件设定了 s 参数时,他将会被完全的移除出这个硬盘空间。 
u  :与 s 相反的,当使用 u 来设定文件时,则数据内容其实还存在磁盘中,可以使用来 undeletion. 

范例: 
[root @test /root]# chattr +i /etc/shadow<==呵呵!如此则无法更动这个文件啰! 
[root @test /root]# chattr -i /etc/shadow <==解除该属性!
说明
这这个指令是重要的,尤其是在系统的安全性上面!由于这些属性是隐藏的性质,所以需要以lsattr 才能看到该属性呦!其中,个人认为最重要的当属 +i 这个属性了,因为他可以让一个档案无法被更动,对于需要强烈的系统安全的人来说,真是相当的重要的!
5.lsattr(显示文件的隐藏属性)
语法: 
[root @test /root ]# lsattr [-aR] 文件或目录
参数说明: 
-a :将隐藏文件的属性也秀出来; 
-R :连同子目录的数据也一并列出来! 

范例: 
[root @test /root]# chattr +i .bash_logout 
[root @test /root]# lsattr -a  
-------------- ./. 
-------------- ./.. 
---i---------- ./.bash_logout 
-------------- ./.bash_profile 
-------------- ./.bashrc 
-------------- ./.emacs 
-------------- ./.screenrc
说明
这两个指令在使用上必须要特别小心,例如:某天你心情好,突然将 /etc/shadow 这个重要的密码记录文件给他设定成为具有 i 的属性,那么过了若干天之后,你突然要新增使用者,却一直无法新增!别怀疑,赶快去将 i 的属性拿掉吧!

五.文件特殊权限

1. SUID 与 SGID:

那么什么是 SUID 与 SGID 呢?!在说明之前我们先来以一般身份使用者 test 的身份登入,再来看一个文件的内容:
[test@test test]$ ls -l /usr/bin/passwd  
-r-s--x--x    1 root     root        13476 Aug  7  2001 /usr/bin/passwd 
看到了 /usr/bin/passwd 文件的前面属性了吗?怎么会有 s 的属性在原本的 x 呀!?那个就是所谓的 SUID 了!如果是『 -r-xr-s--x 』时,那么 s 就成为所谓的 SGID 了! 当一个文件具有 SUID 的时候,同时 other 的群组具有可执行的权限,那么当 others 群组执行该程序的时候, other 将拥有该文件的 owner 的权限! 』。
[test@test test]$ ls -l /usr/bin/passwd /etc/shadow  
-r-s--x--x    1 root     root        13476 Aug  7  2001 /usr/bin/passwd  
-rw-------    1 root     root         2423 Jun 25 14:29 /etc/shadow 
我们以账号的密码文件来说明好了!注意上面的范例啰!可以看到的是, /etc/shadow 的权限是『只有 root 才能存取 』呦!那么你会不会觉得很奇怪?明明我的一般使用者可以自己修改密码呀!对不对?那么修改密码一定跟 /etc/shadow 这个文件有关,那么怎么回事呀!?使用者是如何修改 /etc/shadow 这个文件的呢?嗯!没错!就是使用 SUID 的功能啦!上面的例子说明了, /usr/bin/passwd 这个文件具有 SUID 的属性,那么当使用者使用 /usr/bin/passwd 这个执行文件时,在执行 pass word 修改的期间就具有 /usr/bin/passwd 这个文件的拥有者 root 的所属权限啰!所以,所以当一般使用者执行 passwd 的时候,将具有 root 的权限,所以他们也可以更改 /etc/shadow 的内容啰!那么由此也可以知道,由于这个 Set UID ( SUID ) 的主要功能是在『 某个文件执行的期间具有文件拥有者的权限 』,因此, s 就是替代上面提到的 x 这个可执行的位置啰!那万一该文件并没有 x 的属性呢?哈哈!问的好!那么该文件的属性就会将小写的 s 变成大写的 S 啦! ( 这里即使暂时不了解也没有关系,等到过一阵子再回来看一看,你就会了解啦! ) 
不过,由此也知道 SUID 与 SGID 的问题所在,没错!就是太不安全了 !如果你有一个文件具有 root 的权限,那么当开启了 SUID 的时候,嘿嘿!够你瞧的了!!因此,在变更一个文件成为具有 SUID 或 SGID 的情况时,必须要特别小心呢!
2. Sticky bit:
OK!接着下来,我们要来看一下,既然有 SUID 与 SGID ,那么为什么没有在最末位出现 s 取代 x 呢?呵呵!这当然没有必要啦!因为那是属于 others 的权限,你的文件如果是任何人皆可执行的话,那么本来他们就具有权限啦!干嘛还要设定 s 的属性!?不过,这里却真的有另一个属性出现了,那就是 Sticky bit 的属性 ( t ) !这个属性的最大用处在于『具有 sticky bit 属性的该”目录”下的文件,其文件或目录只有文件拥有者及 root 才有权力删除! 』这样是否可以了解了呢?嘿嘿!没错!在我们系统里面本来就预设有一个啦!那就是 /tmp 这个目录!
[test@test test]$ ls -l /  
drwxrwxrwt    2 root     root         4096 Jul 18 13:08 tmp 
如何,发现了吧!虽然该目录具有所有人皆可擦写的权限,但是确有一个 t 出现了,那就是所谓的 sticky bit 啰!在该目录里面虽然你可以建立与修改任何文件,但是却仅能删除自己建立的文件呢!除非你是 root !你可以这样试试看啰:

1. 以 root 登入系统,并且进入 /tmp 当中;

2. touch test,并且更改 test 权限成为 777 ;

3. 以一般使用者登入,并进入 /tmp;

4. 尝试删除 test 这个文件 
如何!?发现了吧!!
3. SUID, SGID, Sticky bit 的设定方法:
前面介绍过 SUID 与 SGID 的功能,那么如何开启文件使成为具有 SUID 与 SGID 的权限呢?!这就需要刚刚的数字更改权限的方法了!现在你应该已经知道数字型态个更改权限方式为『三个数字』的组合,那么如果在这三个数字之前再加上一个数字的话,那最前的面数字就代表这几个属性了! (注:通常我们使用chmod xyz filename 的方式来设定 filename 的属性时,则是假设没有 SUID, SGID 及 Sticky bit 啦! )
4 为 SUID

2 为 SGID

1 为 Sticky bit
假设要将一个文件属性改为『
-rwsr-xr-x』时,由于 s 在使用者权限中,所以是 SUID ,因此,在原先的 755 之前还要加上 4 ,也就是:『 chmod 4755 filename 』来设定!此外,还有大 S 与大 T 的产生喔!参考底下的范例啦!

[root@test tmp]# touch test 
[root@test tmp]# ll 
total 0 
-rw-r--r--    1 root     root            0 Feb  6 23:08 test 
[root@test tmp]# chmod 4755 test 
[root@vbird tmp]# ll 
total 0 
-rwsr-xr-x    1 root     root            0 Feb  6 23:08 test* 
[root@test tmp]# chmod 6755 test 
[root@test tmp]# ll 
total 0 
-rwsr-sr-x    1 root     root            0 Feb  6 23:08 test* 
[root@test tmp]# chmod 1755 test 
[root@test tmp]# ll 
total 0 
-rwxr-xr-t    1 root     root            0 Feb  6 23:08 test* 
上面的三个例子应该都很好说明啊!就是直接将 x 以 s 或者是 t 来取代就是了!
也就是分别为 SUID, SGID 及 sticky bit 的设定方法啦! 
[root@test tmp]# chmod 7666 test 
[root@test tmp]# ll 
total 0 
-rwSrwSrwT    1 root     root            0 Feb  6 23:08 test 
这个例子就要特别小心啦!怎么会出现大写的 S 与 T 呢?不都是小写的吗?
因为 s 与 t 都是取代 x 这个参数的,但是你有没有发现阿,我们是下达 7666 喔!
也就是说, user, group 以及 others 都没有 x 这个可执行的标志 ( 因为 666 嘛! ),
所以,这个 S, T 代表的就是『空的』啦!怎么说? 
SUID 是表示 [该文件在执行的时候,具有文件拥有者的权限],
但是档案拥有者都无法执行了,哪里来的权限给其它人使用?当然就是空的啦!
4. file (文件类型)
语法: 
[root @test /root ]# file [文件名]  
参数说明:  
范例:  
[root @test /root]# file ~/.bashrc  
/root/.bashrc: ASCII text  <==表示这个文件是 ASCII 纯文字文件  

[root @test /root]# file /usr/bin/passwd 
/usr/bin/passwd: setuid ELF 32-bit LSB executable, Intel 80386, 
version 1, dynamically linked (uses shared libs), stripped 
嘿!还可以看到是否具有 SUID 的权限呢!
说明
file 这个指令也蛮好用的,可以用来查看这个文件的类型,例如 ASCII 格式文件,还是 binary 的文件,且其中是否使用到动态函数库等信息,还可以用来观看文件是否被加入 SUID 等等的信息!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值