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 

范例三:将/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 

   行号加上来了,那么如果要让行号前面自动补上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基础--文件与目录管理,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。