Linux基础--文件与目录管理

1、目录与路径
1)特殊目录
.   代表此层目录
..  代表上一层目录
-   代表前一个工作目录
~   代表『目前使用者身份』所在的家目录
~account   代表account这个使用者的家目录

2)基本命令
cd:变换目录
pwd:显示目前的目录
mkdir:建立一个新的目录
rmdir:删除一个空的目录

3)mkdir  建立新目录
[root@linux ~]# mkdir [-mp] 目录名称
参数:
-m:设定档案的权,直接设定,不需要看预设权限(umask)的脸色~
-p:帮助你直接将所需要的目录递归建立起来 
[root@linux ~]# cd /tmp
[root@linux tmp]# mkdir test      <== 建立一名为test的新目录
[root@linux tmp]# mkdir test1/test2/test3/test4
mkdir: cannot create directory `test1/test2/test3/test4':
No such file or directory         <== 没办法直接建立此目录
[root@linux tmp]# mkdir -p test1/test2/test3/test4   #加了这个-p的参数,可以自行帮您建立多层目录
[root@linux tmp]# mkdir -m 711 test2
[root@linux tmp]# ls -l
drwxr-xr-x 3 root root 4096 Jul 18 12:50 test
drwxr-xr-x 3 root root 4096 Jul 18 12:53 test1
drwx--x--x 2 root root 4096 Jul 18 12:54 test2
  仔细看上面的权限部分,如果没有加上-m来强制设定属性,系统会使用预设属性。 那么您的预设属性为何?这要透过umask才能了解!
4)rmdir  删除空目录
[root@linux ~]# rmdir [-p] 目录名称
参数:
-p:连同上层『空的』目录也一起删除
[root@linux tmp]# ls -l
drwxr-xr-x 3 root root 4096 Jul 18 12:50 test
drwxr-xr-x 3 root root 4096 Jul 18 12:53 test1
drwx--x--x 2 root root 4096 Jul 18 12:54 test2
[root@linux tmp]# rmdir test
[root@linux tmp]# rmdir test1
rmdir: `test1': Directory not empty
[root@linux tmp]# rmdir -p test1/test2/test3/test4  
[root@linux tmp]# ls -l
drwx--x--x 2 root root 4096 Jul 18 12:54 test2
   利用-p这个参数,立刻就可以将test1/test2/test3/test4一次删除~ 不过要注意的是,这个rmdir仅能删除空的目录。

2、档案与目录的检视
[root@linux ~]# ls [-aAdfFhilRS] 目录名称
[root@linux ~]# ls [--color={none,auto,always}] 目录名称
[root@linux ~]# ls [--full-time] 目录名称
参数:
-a:全部的档案,连同隐藏档一起列出来
-A:全部的档案,连同隐藏档,但不包括.与..这两个目录,一起列出来
-d:仅列出目录本身,而不是列出目录内的档案数据
-f:直接列出结果,而不进行排序(ls预设会以档名排序)
-F:根据档案、目录等信息,给予附加数据结构,例如:
    *:代表可执行档; /:代表目录; =:代表 socket 档案; |:代表 FIFO 档案;
-h:将档案容量以人类较易读的方式(例如GB,KB 等等)列出来;
-i:列出 inode 位置,而非列出档案属性;
-l:长数据串行出,包含档案的属性等等数据;
-n:列出UID与GID而非使用者与群组的名称 (UID与GID会在账号管理提到)
-r:将排序结果反向输出,例如:原本档名由小到大,反向则为由大到小;
-R:连同子目录内容一起列出来;
-S:以档案容量大小排序
-t:依时间排序
--color=never:不要依据档案特性给予颜色显示;
--color=always:显示颜色
--color=auto:让系统自行依据设定来判断是否给予颜色
--full-time:以完整时间模式 (包含年、月、日、时、分) 输出
--time={atime,ctime}:输出 access 时间或 改变权限属性时间(ctime)而非内容变更时间(modification time) 
范例一:将家目录下的所有档案列出来(含属性与隐藏文件)
[root@linux ~]# ls -al ~
total 252
drwxr-x--- 9 root root 4096 Jul 16 23:40 .
drwxr-xr-x 24 root root 4096 Jul 16 23:45 ..
-rw------- 1 root root 1491 Jun 25 08:53 anaconda-ks.cfg
-rw------- 1 root root 12543 Jul 18 01:23 .bash_history
-rw-r--r-- 1 root root 24 Dec 4 2004 .bash_logout
-rw-r--r-- 1 root root 191 Dec 4 2004 .bash_profile
-rw-r--r-- 1 root root 395 Jul 4 11:45 .bashrc
-rw-r--r-- 1 root root 68495 Jun 25 08:53 install.log
-rw-r--r-- 1 root root 5976 Jun 25 08:53 install.log.syslog
drwx------ 2 root root 4096 Jul 4 16:03 .ssh
-rw------- 1 root root 12613 Jul 16 23:40 .viminfo
   这个时候您会看到以.为开头的几个档案,以及目录文件./../.ssh等等,不过,目录文件都是以深蓝色显示,有点不容易看清楚就是了。

范例二:承上题,不显示颜色,但在文件名末显示出该文件名代表的类型(type)
[root@linux ~]# ls -alF --color=never ~
total 252
drwxr-x--- 9 root root 4096 Jul 16 23:40 ./
drwxr-xr-x 24 root root 4096 Jul 16 23:45 ../
-rw------- 1 root root 1491 Jun 25 08:53 anaconda-ks.cfg
-rw------- 1 root root 12543 Jul 18 01:23 .bash_history
-rw-r--r-- 1 root root 24 Dec 4 2004 .bash_logout
-rw-r--r-- 1 root root 191 Dec 4 2004 .bash_profile
-rw-r--r-- 1 root root 395 Jul 4 11:45 .bashrc
-rw-r--r-- 1 root root 68495 Jun 25 08:53 install.log
-rw-r--r-- 1 root root 5976 Jun 25 08:53 install.log.syslog
drwx------ 2 root root 4096 Jul 4 16:03 .ssh/
-rw------- 1 root root 12613 Jul 16 23:40 .viminfo
   注意看到显示结果的第一行,知道为何我们会下达类似./command之类的指令了吧?因为./代表的是『目前目录下』的意思。

范例三:完整的呈现档案的修改时间*(modification time)
[root@linux ~]# ls -al --full-time ~
total 252
drwxr-x--- 9 root root 4096 2005-07-16 23:40:13.000000000 +0800 .
drwxr-xr-x 24 root root 4096 2005-07-16 23:45:05.000000000 +0800 ..
-rw------- 1 root root 1491 2005-06-25 08:53:37.000000000 +0800 anaconda-ks.cfg
-rw------- 1 root root 12543 2005-07-18 01:23:33.000000000 +0800 .bash_history
-rw-r--r-- 1 root root 24 2004-12-04 05:44:13.000000000 +0800 .bash_logout
-rw-r--r-- 1 root root 191 2004-12-04 05:44:13.000000000 +0800 .bash_profile
-rw-r--r-- 1 root root 395 2005-07-04 11:45:16.000000000 +0800 .bashrc
-rw-r--r-- 1 root root 68495 2005-06-25 08:53:34.000000000 +0800 install.log
-rw-r--r-- 1 root root 5976 2005-06-25 08:53:28.000000000 +0800 install.log.syslog
drwx------ 2 root root 4096 2005-07-04 16:03:24.000000000 +0800 .ssh
-rw------- 1 root root 12613 2005-07-16 23:40:13.000000000 +0800 .viminfo
   请仔细看,上面的『时间』字段变了,变成较为完整的格式。一般来说,ls -al仅列出目前短格式的时间,有时不会列出年份,藉由--full-time可以查阅到比较正确的完整时间格式。

3、复制、移动与删除
1)cp  复制档案或目录
[root@linux ~]# cp [-adfilprsu] 来源档(source) 目的檔(destination)
[root@linux ~]# cp [options] source1 source2 source3 .... directory
参数:
-a:相当于-pdr的意思;
-d:若来源文件为连结文件的属性(link file),则复制连结文件属性而非档案本身;
-f:为强制(force)的意思,若有重复或其它疑问时,不会询问使用者,而强制复制;
-i:若目的檔(destination)已经存在时,在覆盖时会先询问是否真的动作!
-l:进行硬式连结 (hard link) 的连结档建立,而非复制档案本身;
-p:连同档案的属性一起复制过去,而非使用预设属性;
-r:递归持续复制,用于目录的复制行为;
-s:复制成为符号连结文件(symbolic link),亦即『快捷方式』档案;
-u:若 destination 比 source 旧才更新 destination !
   最后需要注意的,如果来源档有两个以上,则最后一个目的文件一定要是『目录』才行!

范例一:将家目录下的.bashrc复制到/tmp下,并更名为bashrc
[root@linux ~]# cd /tmp
[root@linux tmp]# cp ~/.bashrc bashrc
[root@linux tmp]# cp -i ~/.bashrc bashrc
cp: overwrite `basrhc'? n
   重复作两次动作,由于/tmp底下已经存在bashrc了,加上-i参数,则在覆盖前会询问使用者是否确定!可以按下n或者y。但是,反过来说,如果不想要询问时,则加上-f参数来强制直接覆盖。

范例二:将/var/log/wtmp复制到/tmp底下
[root@linux tmp]# cp /var/log/wtmp . <==想要复制到目前的目录,最后的 . 不要忘
[root@linux tmp]# ls -l /var/log/wtmp wtmp
-rw-rw-r-- 1 root utmp 71808 Jul 18 12:46 /var/log/wtmp
-rw-r--r-- 1 root root 71808 Jul 18 21:58 wtmp
   注意到了吗?在不加任何参数的情况下,档案的所属者会改变,连权限也跟着改变了~ 这是个很重要的特性!还有,连档案建立的时间也不一样了!如果您想要将档案的所有特性都一起复制过来,可以加上-a!
[root@linux tmp]# cp -a /var/log/wtmp wtmp_2
[root@linux tmp]# ls -l /var/log/wtmp wtmp_2
-rw-rw-r-- 1 root utmp 71808 Jul 18 12:46 /var/log/wtmp
-rw-rw-r-- 1 root utmp 71808 Jul 18 12:46 wtmp_2
   整个资料特性完全一模一样ㄟ!真是不赖~这就是-a的特性。

范例三:复制/etc/这个目录下的所有内容到/tmp底下
[root@linux tmp]# cp /etc/ /tmp
cp: omitting directory `/etc'    <== 如果是目录,不能直接复制,要加上-r的参数
[root@linux tmp]# cp -r /etc/ /tmp
   -r是可以复制目录,但是档案与目录的权限会被改变~所以也可以利用cp -a /etc /tmp来下达指令。

范例四:将范例一复制的bashrc建立一个连结档(symbolic link)
[root@linux tmp]# ls -l bashrc
-rw-r--r-- 1 root root 395 Jul 18 22:08 bashrc
[root@linux tmp]# cp -s bashrc bashrc_slink
[root@linux tmp]# cp -l bashrc bashrc_hlink
[root@linux tmp]# ls -l bashrc*
-rw-r--r-- 2 root root 395 Jul 18 22:08 bashrc
-rw-r--r-- 2 root root 395 Jul 18 22:08 bashrc_hlink
lrwxrwxrwx 1 root root 6 Jul 18 22:31 bashrc_slink -> bashrc
   那个bashrc_slink是由-s的参数造成的,建立的是一个『快捷方式』, 所以您会看到在档案的最右边,会显示这个档案是『连结』到哪里去的!至于那个 bashrc_hlink有趣了!建立了这个档案之后,bashrc与bashrc_hlink所有的参数都一样,只是,第二栏的link数改变成为2了~而不是原本的1。

范例五:若~/.bashrc比/tmp/bashrc新才复制过来
[root@linux tmp]# cp -u ~/.bashrc /tmp/bashrc
   这个-u 的特性,是在目标档案与来源档案有差异时才会复制的。所以比较常被用于『备份』的工作当中。

范例六:将范例四造成的bashrc_slink复制成为bashrc_slink_2
[root@linux tmp]# cp bashrc_slink bashrc_slink_2
[root@linux tmp]# ls -l bashrc_slink*
lrwxrwxrwx 1 root root 6 Jul 18 22:31 bashrc_slink -> bashrc
-rw-r--r-- 1 root root 395 Jul 18 22:48 bashrc_slink_2
   这个例子也是很有趣,原本复制的是连结档,但是却将连结档的实际档案复制过来了,也就是说,如果没有加上任何参数时,复制的是源文件,而非连结文件的属性,若要复制连结文件的属性,就得要使用-d或者-a的参数。

范例七:将家目录的.bashrc及.bash_history复制到/tmp底下
[root@linux tmp]# cp ~/.bashrc ~/.bash_history /tmp
   可以将多个数据一次复制到同一个目录去。

2)rm  移除档案或目录
[root@linux ~]# rm [-fir] 档案或目录
参数:
-f:就是 force 的意思,强制移除;
-i:互动模式,在删除前会询问使用者是否动作
-r:递归删除啊!最常用在目录的删除了
 
范例一:建立一档案后予以删除
[root@linux ~]# cd /tmp
[root@linux tmp]# cp ~/.bashrc bashrc
[root@linux tmp]# rm -i bashrc
rm: remove regular file `bashrc'? y
   如果加上-i的参数就会主动询问,那么如果不要询问呢?就加-f参数。

范例二:删除一个不为空的目录
[root@linux tmp]# mkdir test
[root@linux tmp]# cp ~/.bashrc test/    <== 将档案复制到此目录去,就不是空的目录了
[root@linux tmp]# rmdir test
rmdir: `test': Directory not empty    <== 删不掉啊!因为这不是空的目录
[root@linux tmp]# rm -rf test

范例三:删除一个带有-开头的档案
[root@linux tmp]# ls *aa*
-rw-r--r-- 1 root root 0 Aug 22 10:52 -aaa-
[root@linux tmp]# rm -aaa-
rm: invalid option -- a
Try `rm --help' for more information. <== 因为"-"是参数嘛!
[root@linux tmp]# rm ./-aaa-

3)mv  移动档案与目录或更名
[root@linux ~]# mv [-fiu] source destination
[root@linux ~]# mv [options] source1 source2 source3 .... directory
参数:
-f:force强制的意思,强制直接移动而不询问;
-i:若目标档案(destination)已经存在时,就会询问是否覆盖!
-u:若目标档案已经存在,且source比较新,才会更新(update)
 
范例一:复制一档案,建立一目录,将档案移动到目录中
[root@linux ~]# cd /tmp
[root@linux tmp]# cp ~/.bashrc bashrc
[root@linux tmp]# mkdir mvtest
[root@linux tmp]# mv bashrc mvtest
   将某个档案移动到某个目录去,就是这样做!

范例二:将刚刚的目录名称更名为mvtest2
[root@linux tmp]# mv mvtest mvtest2 <== 这样就更名了!简单~
   其实在 Linux 底下还有个有趣的指令,名称为 rename,该指令则专职进行档案的更名。
 
范例三:再建立两个档案,再全部移动到/tmp/mvtest2当中
[root@linux tmp]# cp ~/.bashrc bashrc1
[root@linux tmp]# cp ~/.bashrc bashrc2
[root@linux tmp]# mv bashrc1 bashrc2 mvtest2
   注意到这边,如果有多个来源档案或目录,则最后一个目标文件一定是『目录』 意思是说,将所有的数据移动到该目录的意思。

4)取得路径的文件名称与目录名称
[root@linux ~]# basename /etc/sysconfig/network
network <== 很简单!就取得最后的档名~
[root@linux ~]# dirname /etc/sysconfig/network
/etc/sysconfig <== 取得的变成目录名了

4、档案内容查阅
1)cat (concatenate) 由第一行开始显示档案内容

[root@linux ~]# cat [-AEnTv]
参数:
-A:相当于 -vET 的整合参数,可列出一些特殊字符
-E:将结尾的断行字符$显示出来;
-n:打印出行号;
-T:将[tab] 按键以^I显示出来;
-v:列出一些看不出来的特殊字符
范例一:检阅/etc/issue这个档案的内容
[root@linux ~]# cat /etc/issue
Fedora Core release 4 (Stentz)
Kernel \r on an \m

范例二:承上题,顺便打印出行号
[root@linux ~]# cat -n /etc/issue
1 Fedora Core release 4 (Stentz)
2 Kernel \r on an \m
3

范例三:将/etc/xinetd.conf的内容完整的显示出来(包含特殊字符)
[root@linux ~]# cat -A /etc/xinetd.conf
#$
# Simple configuration file for xinetd$
#$
# Some defaults, and include /etc/xinetd.d/$
$
defaults$
{$
^Iinstances = 60$
log_type = SYSLOG authpriv$
log_on_success^I^I= HOST PID$
log_on_failure^I^I= HOST$
^Icps^I^I^I= 25 30$
}$
$
includedir /etc/xinetd.d$ 
   在一般的环境中,打印出来的结果在有 [tab] 与空格键,其实看不出来,那么使用cat -A时,会将[tab]按键以^I显示,而断行字符也会显示出来,最特殊的当然就是断行字符了!这个段行字符在Linux与Windows是不一样的。在Linux是以$为断行字符,而在Windows则是以^M$为断行字符。

2)tac  从最后一行开始显示

3)nl  添加行号打印
[root@linux ~]# nl [-bnw] 档案
参数:
-b:指定行号指定的方式,主要有两种:
-b a:表示不论是否为空行,也同样列出行号;
-b t:如果有空行,空的那一行不要列出行号;
-n:列出行号表示的方法,主要有三种:
-n ln:行号在屏幕的最左方显示;
-n rn:行号在自己字段的最右方显示,且不加0;
-n rz:行号在自己字段的最右方显示,且加0;
-w:行号字段的占用的位数。
范例一:列出/etc/issue的内容
[root@linux ~]# nl /etc/issue
1 Fedora Core release 4 (Stentz)
2 Kernel \r on an \m
   注意看,这个档案其实有三行,第三行为空白(没有任何字符),因为他是空白行,所以nl不会加上行号,如果确定要加上行号,可以这样做:
[root@linux ~]# nl -b a /etc/issue
1 Fedora Core release 4 (Stentz)
2 Kernel \r on an \m
3
   行号加上来了,那么如果要让行号前面自动补上0呢?可这样:
[root@linux ~]# nl -b a -n rz /etc/issue
000001 Fedora Core release 4 (Stentz)
000002 Kernel \r on an \m
000003
   自动在自己字段的地方补上0了~预设字段是六位数,如果想要改成3位数?
[root@linux ~]# nl -b a -n rz -w 3 /etc/issue
001 Fedora Core release 4 (Stentz)
002 Kernel \r on an \m
003
   变成仅有3位数了。

4)more  一页一页的显示档案内容
功能键:
空格键(space):代表向下翻一页;
Enter :代表向下翻『一行』;
/字符串 :代表在这个显示的内容当中,向下搜寻『字符串』;
f:立刻显示出文件名以及目前显示的行数;
q:代表立刻离开more ,不再显示该档案内容。

5)less
功能键:
空格键:向下翻动一页;
[pagedown]:向下翻动一页;
[pageup]:向上翻动一页;
/字符串:向下搜寻『字符串』的功能;
?字符串:向上搜寻『字符串』的功能;
n:重复前一个搜寻(与/ 或? 有关!)
N:反向的重复前一个搜寻(与/ 或? 有关!)
q:离开less 这个程序;

6)head  取出前面几行
[root@linux ~]# head [-n number] 档案
参数:
-n:后面接数字,代表显示几行的意思
[root@linux ~]# head /etc/man.config
   预设的情况中,显示前面十行!若要显示前20行,就得要这样:
[root@linux ~]# head -n 20 /etc/man.config

7)tail  取出后面几行
[root@linux ~]# tail [-n number] 档案
参数:
-n:后面接数字,代表显示几行的意思 
[root@linux ~]# tail /etc/man.config
   预设的情况中,显示最后的十行!若要显示最后的20行,就得要这样:
[root@linux ~]# tail -n 20 /etc/man.config

8)非纯文字文件:od
查阅非文字文件,举例来说,如/usr/bin/passwd这个执行档的内容时,可以使用od
[root@linux ~]# od [-t TYPE] 档案
参数:
-t:后面可以接各种『类型 (TYPE)』的输出,例如:
a:利用预设的字符来输出;
c:使用 ASCII 字符来输出
d[size]:利用十进制(decimal)来输出数据,每个整数占用 size bytes ;
f[size]:利用浮点数值(floating)来输出数据,每个数占用 size bytes ;
o[size]:利用八进位(octal)来输出数据,每个整数占用 size bytes ;
x[size]:利用十六进制(hexadecimal)来输出数据,每个整数占用 size bytes ;
范例:
[root@linux ~]# od -t c /usr/bin/passwd
0000000 177 E L F 001 001 001 \0 \0 \0 \0 \0 \0 \0\0 \0
0000020 002 \0 003 \0 001 \0 \0 \0 260 225 004 \b 4 \0\0 \0
0000040 020 E \0 \0 \0 \0 \0 \0 4 \0 \0 \a \0( \0
0000060 035 \0 034 \0 006 \0 \0 \0 4 \0 \0 \0 4 200004 \b
0000100 4 200 004 \b 340 \0 \0 \0 340 \0 \0 \0 005 \0\0 \0
.....中间省略.......

5、档案的创建
[root@linux ~]# touch [-acdmt] 档案
参数:
-a:仅修订access time;
-c:仅修改时间,而不建立档案;
-d:后面可以接日期,也可以使用--date="日期或时间"
-m:仅修改mtime;
-t:后面可以接时间,格式为[YYMMDDhhmm] 
范例一:新建一个空的档案
[root@linux ~]# cd /tmp
[root@linux tmp]# touch testtouch
[root@linux tmp]# ls -l testtouch
-rw-r--r-- 1 root root 0 Jul 19 20:49 testtouch
   注意到,这个档案的大小是0,在预设的状态下,如果touch后面有接档案,则该档案的三个时间 (atime/ctime/mtime) 都会更新为目前的时间。若该档案不存在,则会主动的建立一个新的空的档案。

范例二:将~/.bashrc复制成为bashrc,假设复制完全的属性,检查其日期
[root@linux tmp]# cp ~/.bashrc bashrc
[root@linux tmp]# ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc
-rwxr-xr-x 1 root root 395 Jul 4 11:45 bashrc <==这是 mtime
-rwxr-xr-x 1 root root 395 Jul 19 20:44 bashrc <==这是 atime
-rwxr-xr-x 1 root root 395 Jul 19 20:53 bashrc <==这是 ctime
   在这个案例当中,我们使用了;这个指令分隔符,此外,ll是 ls -l的命令别名,至于;则是同时下达两个指令,且让两个指令依序执行的意思。

范例三:修改案例二的bashrc档案,将日期调整为两天前
[root@linux tmp]# touch -d "2 days ago" bashrc
[root@linux tmp]# ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc
-rwxr-xr-x 1 root root 395 Jul 17 21:02 bashrc
-rwxr-xr-x 1 root root 395 Jul 17 21:02 bashrc
-rwxr-xr-x 1 root root 395 Jul 19 21:02 bashrc
   跟上个范例比较看,本来是19日的变成了17日了 (atime/mtime)~ 不过ctime并没有跟着改变

范例四:将上个范例的bashrc日期改为2005/07/15 2:02
[root@linux tmp]# touch -t 0507150202 bashrc
[root@linux tmp]# ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc
-rwxr-xr-x 1 root root 395 Jul 15 02:02 bashrc
-rwxr-xr-x 1 root root 395 Jul 15 02:02 bashrc
-rwxr-xr-x 1 root root 395 Jul 19 21:05 bashrc
   注意看,日期在atime与mtime都改变了,但ctime则是记录目前的时间

6、档案的权限
档案预设权限:umask
档案特殊权限:SUID/SGID/Sticky Bit

7、档案的属性
1)chattr   设定档案隐藏属性
[root@linux ~]# 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。
注意:这个属性设定上面,比较常见的是a与i的设定值,而且很多设定值必须要身为root才能够设定的。
范例:
[root@linux ~]# cd /tmp
[root@linux tmp]# touch attrtest
[root@linux tmp]# chattr +i attrtest
[root@linux tmp]# rm attrtest
rm: remove write-protected regular empty file `attrtest'? y
rm: cannot remove `attrtest': Operation not permitted
   看到了吗?连root也没有办法将这个档案删除,赶紧解除设定。
[root@linux tmp]# chattr -i attrtest

2)lsattr  显示档案隐藏属性
[root@linux ~]# lsattr [-aR] 档案或目录
参数:
-a:将隐藏文件的属性也秀出来;
-R:连同子目录的数据也一并列出来!
范例:
[root@linux tmp]# chattr +aij attrtest
[root@linux tmp]# lsattr
----ia---j--- ./attrtest

3)file   档案类型
[root@linux ~]# file ~/.bashrc
/root/.bashrc: ASCII text    <== 告诉我们是ASCII的纯文字文件啊!
[root@linux ~]# file /usr/bin/passwd
/usr/bin/passwd: setuid ELF 32-bit LSB executable, Intel 80386,version 1
(SYSV), for GNU/Linux 2.2.5, dynamically linked (uses shared libs), stripped
   数据可多了~包括这个日Set UID 2的档案,使用shared libs, 适合于Intel的386以上机种的硬件。
[root@linux ~]# file /var/lib/slocate/slocate.db
/var/lib/slocate/slocate.db: data    <== 这是data档案!

8、档案的搜寻
1)which    寻找『执行档』
[root@linux ~]# which [-a] command
参数:
-a:将所有可以找到的指令均列出,而不止第一个被找到的指令名称
范例:
[root@linux ~]# which passwd
/usr/bin/passwd
[root@linux ~]# which traceroute -a
/usr/sbin/traceroute
/bin/traceroute

2)whereis   寻找特定档案
[root@linux ~]# whereis [-bmsu] 档案或目录名
参数:
-b: 只找 binary 的档案
-m: 只找在说明文件 manual 路径下的档案
-s: 只找 source 来源档案
-u: 没有说明档的档案!
范例:
[root@linux ~]# whereis passwd
passwd: /usr/bin/passwd /etc/passwd /etc/passwd.OLD
/usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz
   任何与passwd有关的档名都会被列出来。
[root@linux ~]# whereis -b passwd
passwd: /usr/bin/passwd /etc/passwd /etc/passwd.OLD
[root@linux ~]# whereis -m passwd
passwd: /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz

3)locate
[root@linux ~]# locate filename
[root@linux ~]# locate passwd
/lib/security/pam_passwdqc.so
/lib/security/pam_unix_passwd.so
/usr/lib/kde3/kded_kpasswdserver.so
/usr/lib/kde3/kded_kpasswdserver.la
.......中间省略.......

4)find
[root@linux ~]# find [PATH] [option] [action]
参数:
4.1.与时间有关的参数
-atime n:n 为数字,意义为在 n 天之前的『一天之内』被access过的档案;
-ctime n:n 为数字,意义为在 n 天之前的『一天之内』被change过状态的档案;
-mtime n:n 为数字,意义为在 n 天之前的『一天之内』被modification过的档案;
-newer file:file 为一个存在的档案,意思是说,只要档案比file还要新就会被列出来~

4.2.与使用者或群组名称有关的参数
-uid n:n 为数字,这个数字是使用者的账号ID,亦即UID ,这个UID是记录在/etc/passwd里面与账号名称对应的数字
-gid n:n 为数字,这个数字是群组名称的ID,亦即GID,这个GID记录在/etc/group
-user name:name为使用者账号名称,例如 dmtsai
-group name:name为群组名称喔,例如users
-nouser:寻找档案的拥有者不存在/etc/passwd的人
-nogroup:寻找档案的拥有群组不存在于/etc/group的档案
   当您自行安装软件时,很可能该软件的属性当中并没有档案拥有者, 这是可能的!在这个时候,就可以使用-nouser与-nogroup搜寻。

4.3.与档案权限及名称有关的参数
-name filename:搜寻文件名称为filename的档案;
-size [+-]SIZE:搜寻比SIZE还要大(+)或小(-)的档案。这个SIZE的规格有:
   c: 代表byte, k: 代表 1024bytes。所以,要找比50KB还要大的档案,就是『 -size +50k 』
-type TYPE:搜寻档案的类型为TYPE的,类型主要有:一般正规档案(f), 装置档案(b, c), 目录(d), 连结档(l), socket(s)及 FIFO(p)等属性。
-perm mode:搜寻档案属性『刚好等于』mode的档案,这个mode为类似chmod的属性值,举例来说, -rwsr-xr-x的属性为4755。
-perm -mode:搜寻档案属性『必须要全部囊括mode的属性』的档案,举例来说,我们要搜寻-rwxr--r--,亦即0744的档案,使用-perm -0744,当一个档案的属性为 -rwsr-xr-x ,亦即4755时,也会被列出来,因为-rwsr-xr-x的属性已经囊括了-rwxr--r--的属性了。
-perm +mode:搜寻档案属性『包含任一 mode 的属性』的档案,举例来说,我们搜寻-rwxr-xr-x,亦即-perm +755时,但一个档案属性为-rw-------也会被列出来,因为他有-rw....的属性存在。

4.4.额外可进行的动作
-exec command:command为其它指令,-exec后面可再接额外的指令来处理搜寻到的结果。
-print:将结果打印到屏幕上,这个动作是预设动作!

范例一:将过去系统上面24小时内有更动过内容(mtime)的档案列出
[root@linux ~]# find / -mtime 0
   0是重点,代表目前的时间,所以,从现在开始到 24 小时前,有变动过内容的档案都会被列出来。那如果是三天前的 24 小时内? find / -mtime 3 ,意思是说今天之前的3*24~4*24小时之间有变动过的档案都被列出的意思,同时-atime与-ctime的用法相同。

范例二:寻找/etc底下的档案,如果档案日期比/etc/passwd新就列出
[root@linux ~]# find /etc -newer /etc/passwd
   -newer 用在分辨两个档案之间的新旧关系是很有用的。

范例三:搜寻/home底下属于dmtsai的档案
[root@linux ~]# find /home -user dmtsai
   这个东西也很有用的~当我们要找出任何一个使用者在系统当中的所有档案时,就可以利用这个指令将属于某个使用者的所有档案都找出来。

范例四:搜寻系统中不属于任何人的档案
[root@linux ~]# find / -nouser
   透过这个指令,可以轻易的就找出那些不太正常的档案。如果有找到不属于系统任何人的档案时,那有时候是正常的~尤其是您曾经以原始码自行编译软件时。

范例五:找出档名为passwd这个档案
[root@linux ~]# find / -name passwd
   利用这个-name可以搜寻档名啊!
 
范例六:搜寻档案属性为f(一般档案)的档案
[root@linux ~]# find /home -type f
   这个-type的属性也很有帮助,尤其是要找出那些特殊的档案,例如socket与FIFO档案,可以用find /var -type p或-type s来找!

范例七:搜寻档案当中含有SGID/SUID/SBIT的属性
[root@linux ~]# find / -perm +7000
   所谓的7000就是 ---s--s--t,那么只要含有s或t的就列出,所以当然要使用 +7000 ,使用-7000表示要含有---s--s--t的所有三个权限,因此就是+7000。

范例八:将上个范例找到的档案使用ls -l列出来~
[root@linux ~]# find / -perm +7000 -exec ls -l {} \;
   注意到,那个 -exec 后面的 ls -l 就是额外的指令,而那个{}代表的是『由 find 找到的内容』的意思~所以,-exec ls -l {}就是将前面找到的那些档案以ls -l 列出长的数据!至于 \; 则是表示-exec的指令到此为止的意思~意思是说,整个指令其实只有在-exec (里面就是指令下达)\; 也就是说-exec最后一定要以\;结束才行。

范例九:找出系统中大于1MB的档案
[root@linux ~]# find / -size +1000k

上一篇:Linux基础命令操作实例


下一篇:linux基础——文件挂载,lamp安装