您的位置:首页 > 运维架构 > Linux

Linux学习笔记之--常用文件操作及目录管理命令

2013-08-05 11:41 1176 查看

1 目录操作的常用指令:

1.1. 变换目录:cd;

cd 是changedirectory的简写,是变换工作目录的命令;

使用方式 : cd [dirName]

说明 : 变换工作目录至dirName。其中 dirName 表示法可为绝对路径或相对路径。若目录名称省略,则变换至使用者的 home directory (也就是刚 login 时所在的目录)。

另外,"~" 也表示为 homedirectory 的意思,"." 则是表示目前所在的目录,".." 则表示目前目录位置的上一层目录。

范例 : 跳到 /usr/bin/:

cd /usr/bin

跳到自己的 home directory:

cd ~

跳到某个用户的 homedirectory :

cd ~userName

跳到目前目录的上上两层 :

cd ../..

cd - 返回进入当前目录前所在目录;

1.2. 显示当前目录:pwd;

1) 用途

pwd命令用于显示当前工作目录,是Linux下最常用的命令之一。在不太确定当前位置时,就会使用pwd来判定当前目录在文件系统内的确切位置。环境变量OLDPWD表示前一次的工作目录,环境变量PWD表示当前的工作目录。

2) 用法

一般情况下不带任何参数。

格式:pwd

如果目录是链接时。

格式:pwd -P 显示出实际路径,而非使用连接(link)路径。

3) 例子:

示例一 root用户

Last login: Tue Nov 2 19:15:53 2010 from 222.70.145.185

[root@web ~]#pwd

/root

[root@web ~]#echo $OLDPWD

[root@web ~]#echo $PWD

/root

[root@web ~]#cd /etc/init.d

[root@web init.d]#pwd

/etc/init.d

[root@web init.d]#echo $OLDPWD

/root

[root@web init.d]#echo $PWD

/etc/init.d

[root@web init.d]#

示例二 普通用户

Last login: Fri Oct 29 16:18:50 2010 from hnas1

[web@hnweb1 ~]$pwd

/home/web

[web@hnweb1 ~]$echo $OLDPWD

[web@hnweb1 ~]$echo $PWD

/home/web

[web@hnweb1 ~]$cd work

[web@hnweb1 work]$pwd

/home/web/work

[web@hnweb1 work]$echo $OLDPWD

/home/web

[web@hnweb1 work]$echo $PWD

/home/web/work

[web@hnweb1 work]$

示例三 如果目录是个符号链接

[root@web ~]#cd /var/mail

[root@web mail]#pwd

/var/mail

[root@web mail]#pwd -P

/var/spool/mail

[root@web mail]#pwd -L

/var/mail

[root@web mail]#ls -l /var/mail

lrwxrwxrwx 1 root root 10 06-28 17:21 /var/mail -> spool/mail

[root@web mail]#

示例四 当前目录被删除了

在多人共享同一台Linux机器时,经常会发现当前目录被别人删除掉,而pwd命令仍然显示那个目录。下面演示了这种情况。

[root@web ~]#mkdir removed

[root@web ~]#cd removed

[root@web removed]#pwd

/root/removed

[root@web removed]#rm ../removed -rf

[root@web removed]#pwd

/root/removed

[root@web removed]#/bin/pwd

/bin/pwd: couldn't find directory entry in “..” with matching i-node

[root@web removed]#cd

[root@web ~]#

1.3. 建立一个新的目录:mkdir;

1) 用途:

创建一个目录

2) 用法:

格式:mkdir [选项] dir-name

说明:该命令创建由dir-name命名的目录。要求创建目录的用户在当前目录中(dir-name的父目录中)具有写权限,

并且dirname不能是当前目录中已有的目录或文件名称。

命令中各选项的含义为:

- m 对新建目录设置存取权限。也可以用chmod命令设置。

- p 可以是一个路径名称。此时若路径中的某些目录尚不存在,加上此选项后,系统将自动建立好那些尚不存在的目录,

即一次可以建立多个目录。

3) 例子:

范例一:到/tmp底下尝试建立数个新目录看看:

[root@www ~]# cd /tmp

[root@www tmp]# mkdir test <==建立一名为 test 的新目录

[root@www tmp]# mkdir test1/test2/test3/test4

mkdir: cannot create directory`test1/test2/test3/test4':

No such file or directory <== 没办法直接建立此目录

[root@www tmp]# mkdir -p test1/test2/test3/test4

# 加了这个 -p 的选项,可以自行帮你建立多层目录

范例二:建立权限为rwx--x—x的目录

[root@www tmp]# mkdir -m 711 test2

[root@www tmp]# ls -l

drwxr-xr-x 3root root 4096 Jul 18 12:50 test

drwxr-xr-x 3root root 4096 Jul 18 12:53 test1

drwx--x--x 2root root 4096 Jul 18 12:54 test2

# 仔细看上面的权限部分,如果没有加上 -m 将强制设定属性,系统会使用默认

属性。

1.4. 删除一个空的目录:rmdir;

1) 用途:

功能是删除一个空的目录

2) 用法:

语法:rmdir [选项] dirname

说明:dirname表示目录名。该命令从一个目录中删除一个或多个子目录项。需要特别注意的是,一个目录被删除之前必须是空的。(注意,rm - r dir命令可代替rmdir,但是有很大危险性。)删除某目录时也必须具有对父目录的写权限。

命令中各选项的含义为:

-p 递归删除目录dirname,当子目录删除后其父目录为空时,也一同被删除。如果整个路径被删除或者由于某种原因保留部分路径,则系统在标准输出上显示相应的信息。

使用 rmdir 命令可以删除空目录。要一次性删除目录及其全部内容,请同时使用 rm 命令和 -rf 选项。

删除目录之后,将无法继续使用,此目录也不会再出现在 ll 或其他高于此目录的目录列表中。

使用 rmdir 删除目录之前,必须删除该目录下所有的可见文件或隐藏文件。

3) 例子:

范例一:将于mkdir范例中建立的目录(/tmp底下)删除掉!

[root@www tmp]# ls -l <==看看有多少目录存在?

drwxr-xr-x 3root root 4096 Jul 18 12:50 test

drwxr-xr-x 3root root 4096 Jul 18 12:53 test1

drwx--x--x 2root root 4096 Jul 18 12:54 test2

[root@www tmp]# rmdir test <==可直接删除掉,没问题

[root@www tmp]# rmdir test1 <==因为尚有内容,所以无法删除!

rmdir: `test1': Directory not empty

[root@www tmp]# rmdir -p test1/test2/test3/test4

[root@www tmp]# ls -l <==您看看,底下的输出中test与test1不见了!

drwx--x--x 2root root 4096 Jul 18 12:54 test2

# 利用 -p 这个选项,立刻就可以将 test1/test2/test3/test4 一次删除~

# 不过要注意的是,这个rmdir 仅能『删除空的目录』

2 文件与目录管理的常用命令:

2.1 文件与目录查看命令:ls;

1) 用途:

列出目录内容。注:ll代表ls –l命令。

2) 用法:

语法:ls[-1aAbBcCdDfFgGhHiklLmnNopqQrRsStuUvxX][-I <范本样式>][-T <跳格字数>][-w<每列字符数>][--block-size=<区块大小>][--color=<使用时机>][--format=<列表格式>][--full-time][--help][--indicator-style=<标注样式>][--quoting-style=<引号样式>][--show-control-chars][--sort=<排序方式>][--time=<时间戳记>][--version][文件或目录...]

补充说明:执行ls指令可列出目录的内容,包括文件和子目录的名称。

参数:

-1 每列仅显示一个文件或目录名称。

-a或--all 下所有文件和目录。

-A或--almost-all 显示所有文件和目录,但不显示现行目录和上层目录。

-b或--escape 显示脱离字符。

-B或--ignore-backups 忽略备份文件和目录。

-c 以更改时间排序,显示文件和目录。

-C 以又上至下,从左到右的直行方式显示文件和目录名称。

-d或--directory 显示目录名称而非其内容。

-D或--dired 用Emacs的模式产生文件和目录列表。

-f 此参数的效果和同时指定"aU"参数相同,并关闭"lst"参数的效果。

-F或--classify 在执行文件,目录,Socket,符号连接,管道名称后面,各自加上"*","/","=","@","|"号。

-g 次参数将忽略不予处理。

-G或--no-group 不显示群组名称。

-h或--human-readable 用"K","M","G"来显示文件和目录的大小。

-H或--si 此参数的效果和指定"-h"参数类似,但计算单位是1000Bytes而非1024Bytes。

-i或--inode 显示文件和目录的inode编号。

-I<范本样式>或--ignore=<范本样式> 不显示符合范本样式的文件或目录名称。

-k或--kilobytes 此参数的效果和指定"block-size=1024"参数相同。

-l 使用详细格式列表。

-L或--dereference 如遇到性质为符号连接的文件或目录,直接列出该连接所指向的原始文件或目录。

-m 用","号区隔每个文件和目录的名称。

-n或--numeric-uid-gid 以用户识别码和群组识别码替代其名称。

-N或--literal 直接列出文件和目录名称,包括控制字符。

-o 此参数的效果和指定"-l"参数类似,但不列出群组名称或识别码。

-p或--file-type 此参数的效果和指定"-F"参数类似,但不会在执行文件名称后面加上"*"号。

-q或--hide-control-chars 用"?"号取代控制字符,列出文件和目录名称。

-Q或--quote-name 把文件和目录名称以""号标示起来。

-r或--reverse 反向排序。

-R或--recursive 递归处理,将指定目录下的所有文件及子目录一并处理。

-s或--size 显示文件和目录的大小,以区块为单位。

-S 用文件和目录的大小排序。

-t 用文件和目录的更改时间排序。

-T<跳格字符>或--tabsize=<跳格字数> 设置跳格字符所对应的空白字符数。

-u 以最后存取时间排序,显示文件和目录。

-U 列出文件和目录名称时不予排序。

-v 文件和目录的名称列表以版本进行排序。

-w<每列字符数>或--width=<每列字符数> 设置每列的最大字符数。

-x 以从左到右,由上至下的横列方式显示文件和目录名称。

-X 以文件和目录的最后一个扩展名排序。

--block-size=<区块大小> 指定存放文件的区块大小。

--color=<列表格式> 培植文件和目录的列表格式。

--full-time 列出完整的日期与时间。

--help 在线帮助。

--indicator-style=<标注样式> 在文件和目录等名称后面加上标注,易于辨识该名称所属的类型。

--quoting-syte=<引号样式> 把文件和目录名称以指定的引号样式标示起来。

--show-control-chars 在文件和目录列表时,使用控制字符。

--sort=<排序方式> 配置文件和目录列表的排序方式。

--time=<时间戳记> 用指定的时间戳记取代更改时间。

--version 显示版本信息。

3) 例子:

范例一:将家目录下癿所有档案列出来(含属性与隐藏文件)

[root@www ~]# ls-al ~

total 156

drwxr-x--- 4 root root 4096 Sep 24 00:07 .

drwxr-xr-x 23 rootroot 4096 Sep 22 12:09 ..

-rw------- 1 root root 1474 Sep 4 18:27 anaconda-ks.cfg

-rw------- 1 root root 955 Sep 24 00:08 .bash_history

-rw-r--r-- 1 root root 24 Jan 6 2007 .bash_logout

-rw-r--r-- 1 root root 191 Jan 6 2007 .bash_profile

-rw-r--r-- 1 root root 176 Jan 6 2007 .bashrc

drwx------ 3 root root 4096 Sep 5 10:37 .gconf

-rw-r--r-- 1 root root 42304 Sep 4 18:26 install.log

-rw-r--r-- 1 root root 5661 Sep 4 18:25install.log.syslog

# 这个时候你会看到以 . 为开头癿几个档案,以及目录文件 (.) (..) .gconf 等等,

# 不过,目录文件文件名都是以深蓝色显示,有点不容易看清楚就是了。

范例二:承上题,不显示颜色,但在文件名末显示出该文件名代表的类型(type)

[root@www ~]# ls-alF --color=never ~

total 156

drwxr-x--- 4 root root 4096 Sep 24 00:07 ./

drwxr-xr-x 23 rootroot 4096 Sep 22 12:09 ../

-rw------- 1 root root 1474 Sep 4 18:27 anaconda-ks.cfg

-rw------- 1 root root 955 Sep 24 00:08 .bash_history

-rw-r--r-- 1 root root 24 Jan 6 2007 .bash_logout

-rw-r--r-- 1 root root 191 Jan 6 2007 .bash_profile

-rw-r--r-- 1 root root 176 Jan 6 2007 .bashrc

drwx------ 3 root root 4096 Sep 5 10:37 .gconf/

-rw-r--r-- 1 root root 42304 Sep 4 18:26 install.log

-rw-r--r-- 1 root root 5661 Sep 4 18:25install.log.syslog

# 注意看到显示结果癿第一行,嘿嘿~知道为何我们会下达类似 ./command

# 之类的指令了吧?因为 ./代表癿是『目前目录下』的意思啊!至于什么是

FIFO/Socket ?

# 请参考前一章节癿介绍啊!另外,那个.bashrc 时间仅写2007,能否知道详绅

时间?

范例三:完整的呈现文件修改时间 *(modification time)

[root@www ~]# ls-al --full-time ~

total 156

drwxr-x--- 4 root root 4096 2008-09-24 00:07:00.000000 +0800 .

drwxr-xr-x 23 rootroot 4096 2008-09-22 12:09:32.000000+0800 ..

-rw------- 1 root root 1474 2008-09-04 18:27:10.000000 +0800

anaconda-ks.cfg

-rw------- 1 root root 955 2008-09-24 00:08:14.000000

+0800.bash_history

-rw-r--r-- 1 root root 24 2007-01-06 17:05:04.000000

+0800 .bash_logout

-rw-r--r-- 1 root root 191 2007-01-06 17:05:04.000000

+0800.bash_profile

-rw-r--r-- 1 root root 176 2007-01-06 17:05:04.000000 +0800 .bashrc

drwx------ 3 root root 4096 2008-09-05 10:37:49.000000 +0800 .gconf

-rw-r--r-- 1 root root 42304 2008-09-04 18:26:57.000000+0800

install.log

-rw-r--r-- 1 root root 5661 2008-09-04 18:25:55.000000 +0800

install.log.syslog

# 请仔绅看,上面癿『时间』字段变了喔!变成较为完整的格式。

# 一般来说, ls -al 仅列出目前短格式的时间,有时还会列出年份

2.2 复制、删除与移劢:cp,rm, mv;

2.2.1 cp 命令:

1) 用途:

复制文件或目录。

2) 用法:

命令格式:

cp [-adfilprsu] 杢源文件(source) 目标文件(destination

cp [options] source1 source2 source3 .... directory

说明: cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中。若同时指定多个文件或目录,而最后的目的地并非一个已存在的目录,则会出现错误信息

参数:

-a 或 --archive 此参数的效果和同时指定"-dpR"参数相同

-b 或 --backup 删除、覆盖目的文件先备份,备份的文件或目录亦建立为符号链接,并指向源文件或目录链接的源文件或目录。假如没有加上这个参数,在复制过程中若遇到符号链接,则会直接复制源文件或目录

-f 或 --force 强行复制文件或目录, 不论目的文件或目录是否已经存在

-i 或 --interactive 覆盖文件之前先询问用户

-l 或 --link 对源文件建立硬链接,而非复制文件

-p 或 --preserve 保留源文件或目录的属性,包括所有者、所属组、权限与时间

-P 或 --parents 保留源文件或目录的路径,此路径可以是绝对路径或相对路径,且目的目录必须已经丰在

-r 递归处理,将指定目录下的文件与子目录一并处理。若源文件或目录的形态,不属于目录或符号链接,则一律视为普通文件处理

-R 或 --recursive 递归处理,将指定目录下的文件及子目录一并处理

-s 或 --symbolic-link 对源文件建立符号链接,而非复制文件

-S <备份字尾字符串> 或 --suffix=<备份字尾字符串> 用"-b"参数备份目的文件后,备份文件的字尾会被加上一个备份字符串。默认的备份字尾符串是符号"~"

-u 或 --update 使用这项参数之后,只会在源文件的修改时间(Modification Time)较目的文件更新时,或是名称相互对应的目的文件并不存在,才复制文件

-v 或--verbose 显示执行过程

-V <备份方式> 或 --version-control=<备份方式> 指定当备份文件时,备份文件名的命名方式,有以下3种:

1.numbered或t, 将使用备份编号,会在字尾加上~1~字符串,其数字编号依次递增

2.simple或never 将使用简单备份,默认的备份字尾字符串是~, 也可通过-S来指定

3.existing或nil将使用当前方式,程序会先检查是否存在着备份编号,若有则采用备份编号,若无则采用简单备份

-x 或 --one-file-system 复制的文件或目录存放的文件系统,必须与cp指令执行时所处的文件系统相同,否则不复制,亦不处理位于其他分区的文件

--help 显示在线帮助

--sparse=<使用时机> 设置保存希疏文件的时机

--version 显示版本

3) 例子:

范例一:用root身份,将家目录下的.bashrc 复制到 /tmp 下,并更名为

bashrc

[root@www ~]# cp ~/.bashrc/tmp/bashrc

[root@www ~]# cp -i~/.bashrc /tmp/bashrc

cp: overwrite`/tmp/bashrc'? n <==n不覆盖,y为覆盖

# 重复作两次操作,由于 /tmp 底下已经存在 bashrc了,加上 -i 选项后,

# 则在覆盖前会询问使用者是否确定!可以按下 n或者 y 来二次确认!

范例二:变换目录到/tmp,并将/var/log/wtmp复制到/tmp且观察属性:

[root@www ~]# cd /tmp

[root@www tmp]# cp/var/log/wtmp . <==想要复制到当前目录,最后的.

不要忘

[root@www tmp]# ls -l/var/log/wtmp wtmp

-rw-rw-r-- 1 root utmp96384 Sep 24 11:54 /var/log/wtmp

-rw-r--r-- 1 root root96384 Sep 24 14:06 wtmp

# 注意上面的特殊字体,在不加任何选项癿情况下,档案的某些属性/权限会改

变;

# 这是个很重要的特性!要注意喔!还有,连档案建立的时间也不一样了!

# 那如果你想要将文件的所有特性都一起复制过来该怎么办?可以加上 -a 喔!如

下所示:

[root@www tmp]# cp -a/var/log/wtmp wtmp_2

[root@www tmp]# ls -l/var/log/wtmp wtmp_2

-rw-rw-r-- 1 root utmp96384 Sep 24 11:54 /var/log/wtmp

-rw-rw-r-- 1 root utmp96384 Sep 24 11:54 wtmp_2

范例三:复制 /etc/ 这个目录下的所有内容到/tmp 底下

[root@www tmp]# cp /etc//tmp

cp: omitting directory`/etc' <== 如果是目录则不能直接复制,要加上 -r 的

选项

[root@www tmp]# cp -r/etc/ /tmp

# 还是要再次的强调喔! -r 是可以复制目录,但是,文件与目录的权限可能会被

改变

# 所以,也可以利用『 cp -a /etc /tmp 』来下达命令喔!尤其是在备份的情况

下!

范例四:将范例一复制的 bashrc 建立一个连结档(symbolic link)

[root@www tmp]# ls -lbashrc

-rw-r--r-- 1 root root 176Sep 24 14:02 bashrc <==先观察一下文件情况

[root@www tmp]# cp -sbashrc bashrc_slink

[root@www tmp]# cp -lbashrc bashrc_hlink

[root@www tmp]# ls -lbashrc*

-rw-r--r-- 2 root root 176Sep 24 14:02 bashrc <==与源文件不太一样了!

-rw-r--r-- 2 root root 176Sep 24 14:02 bashrc_hlink

lrwxrwxrwx 1 rootroot 6 Sep 24 14:20 bashrc_slink ->bashrc

范例五:若 ~/.bashrc 比 /tmp/bashrc新才复制过来

[root@www tmp]# cp -u~/.bashrc /tmp/bashrc

# 这个 -u 的特性,是在目标文件与来源档案有差异时,才会复制的。

# 所以,比较常被用于『备份』的工作当中

范例六:将范例四造成的 bashrc_slink 复制成为bashrc_slink_1与

bashrc_slink_2

[root@www tmp]# cpbashrc_slink bashrc_slink_1

[root@www tmp]# cp -dbashrc_slink bashrc_slink_2

[root@www tmp]# ls -lbashrc bashrc_slink*

-rw-r--r-- 2 root root 176Sep 24 14:02 bashrc

lrwxrwxrwx 1 rootroot 6 Sep 24 14:20 bashrc_slink ->bashrc

-rw-r--r-- 1 root root 176Sep 24 14:32 bashrc_slink_1 <==来源文件相



lrwxrwxrwx 1 rootroot 6 Sep 24 14:33 bashrc_slink_2-> bashrc <==是连

结档!

# 这个例子也是很有趣喔!原本复制的是连结档,但是即将连结档的实际档案复

制过来了

# 也就是说,如果没有加上任何选项时,cp复制的是源文件,而非链接文件的属

性!

# 若要复制链接文件的属性,就得要使用 -d 癿选项了!如bashrc_slink_2 所

示。

范例七:将家目录的 .bashrc 及.bash_history 复制到 /tmp 底下

[root@www tmp]# cp~/.bashrc ~/.bash_history /tmp

# 可以将多个数据一次复制到同一个目录去!最后面一定是目录!

2.2.2 rm 命令:

1) 用途:

删除档案及目录。

2) 用法:

命令格式:rm [options] name...

参数:

-i 删除前逐一询问确认。

-f 即使原档案属性设为唯读,亦直接删除,无需逐一确认。

-r 将目录及以下之档案亦逐一删除。

范例:

删除所有C语言程式档;删除前逐一询问确认 :

rm -i *.c

将 Finished 子目录及子目录中所有档案删除 :

rm -r Finished

功能说明:删除文件或目录。

语法:rm [-dfirv][--help][--version][文件或目录...]

补充说明:执行rm指令可删除文件或目录,如欲删除目录必须加上参数"-r",否则预设仅会删除文件。

参数:

-d或--directory  直接把欲删除的目录的硬连接数据删成0,删除该目录。

-f或--force  强制删除文件或目录。

-i或--interactive  删除既有文件或目录之前先询问用户。

-r或-R或--recursive  递归处理,将指定目录下的所有文件及子目录一并处理。

-v或--verbose  显示指令执行过程。

--help 在线帮助。

--version 显示版本信息。

3) 例子:

范例一:将刚刚在 cp 的范例中建立的 bashrc 删除掉!

[root@www~]# cd /tmp

[root@wwwtmp]# rm -i bashrc

rm:remove regular file `bashrc'? y

# 如果加上 -i 的选项就会主动询问喔,避免你删除到错误癿档名!

范例二:透过通配符*癿帮忙,将/tmp底下开头为bashrc癿档名通通删除:

[root@wwwtmp]# rm -i bashrc*

# 注意那个星号,代表癿是 0 到无穷多个任意字符喔!很好用的东西!

范例三:将 cp 范例中所建立的 /tmp/etc/ 这个目录删除掉!

[root@wwwtmp]# rmdir /tmp/etc

rmdir:etc: Directory not empty <== 删不掉啊!因为这不是空白目录!

[root@wwwtmp]# rm -r /tmp/etc

rm:descend into directory `/tmp/etc'? y

....(中间省略)....

# 因为身份是 root ,预先已经加入了 -i 癿选项,所以你要一直按 y 才会删除!

# 如果不想要继续按 y ,可以按下『[ctrl]-c 』来结束 rm 的工作。

# 这是一种保护的动作,如果确定要删除掉此目录而不要询问,可以这样做:

[root@wwwtmp]# \rm -r /tmp/etc

# 在命令前加上反斜杠,可以省略掉 alias 的设定选项喔!至于alias 我们在

bash再谈!

范例四:删除一个带有 - 开头的文件

[root@wwwtmp]# touch ./-aaa- <==touch这个命令可以建立空档案!

[root@wwwtmp]# ls -l

-rw-r--r--1 root root 0 Sep 24 15:03 -aaa- <==档案大小为0,所以是

空档案

[root@wwwtmp]# rm -aaa-

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

判了!

[root@wwwtmp]# rm ./-aaa-

2.2.3 mv 命令:

1) 用途:

移动或更名现有的文件或目录

2) 用法:

命令格式:mv [-bfiuv][--help][--version][-S<附加字尾>][-V <方法>][源文件或目录][目标文件或目录]

补充说明:mv可移动文件或目录,或是更改文件或目录的名称。

参数:

-b或--backup  若需覆盖文件,则覆盖前先行备份。

-f或--force  若目标文件或目录与现有的文件或目录重复,则直接覆盖现有的文 件或目录。

-i或--interactive 覆盖前先行询问用户。

-S<附加字尾>或

--suffix=<附加字尾>  与-b参数一并使用,可指定备份文件的所要附加的字尾。

-u或--update  在移动或更改文件名时,若目标文件已存在,且其文件日期比源文件新,则不覆盖目标文件。

-v或--verbose  执行时显示详细的信息。

-V=<方法>或

--version-control=<方法>  与-b参数一并使用,可指定备份的方法。

--help  显示帮助。

--version  显示版本信息。

3) 例子:

范例一:复制一文件,建立一目录,将文件移动到目录中

[root@www ~]# cd/tmp

[root@www tmp]# cp~/.bashrc bashrc

[root@www tmp]#mkdir mvtest

[root@www tmp]# mvbashrc mvtest

# 将某个档案移动到某个目录去,就是这样做!

范例二:将刚刚的目录名称更名为 mvtest2

[root@www tmp]# mvmvtest mvtest2 <== 这样就更名了!简单~

# 其实在 Linux 底下还有个有趣的命令,名称为 rename ,

# 该命令专职进行多个档名的同时更名,并非针对单一档名变更,与mv不同。

请man rename。

范例三:再建立两个文件,再全部移动到 /tmp/mvtest2 当中

[root@www tmp]# cp~/.bashrc bashrc1

[root@www tmp]# cp~/.bashrc bashrc2

[root@www tmp]# mvbashrc1 bashrc2 mvtest2

# 注意到这边,如果有多个来源文件或目录,则最后一个目标文件一定是『目

录!』

# 意思是说,将所有的数据移动到该目录的意思!

2.3 文件查看:cat,tac, nl, more, less, head, tail, od;

2.3.1 cat 命令:

cat [-AbEnTv]

选项与参数:

-A :相当于 -vET 的整合选项,可列出一些特殊字符而不是空白而已;

-b :列出行号,仅针对非空白行做行号显示,空白行不标行号!

-E :将结尾的断行字符 $ 显示出杢;

-n :打印出行号,连同空白行也会有行号,不-b 癿选项不同;

-T :将 [tab] 按键以 ^I 显示出来;

-v :列出一些看不出来的特殊字符

范例一:检阅 /etc/issue 这个档案的内容

[root@www ~]# cat/etc/issue

CentOS release 5.3(Final)

Kernel \r on an \m

范例二:承上题,如果还要加印行号呢?

[root@www ~]# cat-n /etc/issue

1 CentOS release 5.3 (Final)

2 Kernel \r on an \m

3

# 看到了吧!可以印出行号呢!这对于大文件要找某个特定的行时,有点用处!

# 如果不想要编排空白行的行号,可以使用『cat -b /etc/issue』,自己测试看

看:

范例三:将/etc/xinetd.conf 的内容完整的显示出来(包括特殊字符)

[root@www ~]# cat-A /etc/xinetd.conf

#$

....(中间省略)....

$

defaults$

{$

# The next twoitems are intended to be a quick access place to$

....(中间省略)....

^Ilog_type^I=SYSLOG daemon info $

^Ilog_on_failure^I=HOST$

^Ilog_on_success^I=PID HOST DURATION EXIT$

....(中间省略)....

includedir/etc/xinetd.d$

$

# 使用 [tab] 不空格键的效果差不多,都是一堆空白啊!我们无法知道两者的差

别。

# 此时使用 cat -A 就能够发现那些空白的地方是啥鬼东西了![tab]会以 ^I 表

示,

# 断行字符则是以 $ 表示,所以你可以发现每一行后面都是 $ 啊!不过断行字符

2.3.2 more 命令:

在 more 这个程序癿运作过程中,有几个按键可以操作:

空格键 (space):代表向下翻一页;

Enter :代表向下翻『一行』;

/字符串 :代表在这个显示的内容当中,向下搜寻『字符串』这个关键词;

:f :立刻显示出文件名以及目前显示的行数;

q :代表立刻离开 more ,丌再显示该档案内容。

b 戒 [ctrl]-b :代表往回翻页,丌过这劢作叧对档案有用,对管线无用。

2.3.3 less 命令:

可以输入的指令有:

空格键 :向下翻动一页;

[pagedown]:向下翻动一页;

[pageup] :向上翻动一页;

/字符串 :向下搜寻『字符串』的功能;

?字符串 :向上搜寻『字符串』的功能;

n :重复前一个搜寻 (不 / 戒 ? 有关!)

N :反向的重复前一个搜寻 (不 / 戒 ? 有关!)

q :离开 less 这个程序;

2.3.4 head\tail 命令:

head: head 的英文意忠就是『头』啦,那么这个东西癿用法自然就是显示出一个档案的前几行啰!若没有加上 -n 这个选项时,默认只显示十行,若只要一行呢?那就加入『 head -n 1

filename 』即可!

另外那个 -n 选项后面的参数较有趣,如果接的是负数,例如上面范例的-n -100时,代表列前癿所有

行数, 但丌包括后面100行。丼例杢说,/etc/man.config共有141行,则上述癿挃令『head-n -100 /etc/man.config』就会列出前面41行,后面100行丌会打印出杢了。

tail: root@www ~]# tail [-n number] 文件

选项不参数:

-n :后面接数字,代表显示几行的意思

-f :表示持续侦测后面所接的文件名,要等到按下[ctrl]-c才会结束tail的侦测

[root@www ~]# tail/etc/man.config

# 默认的情况中,显示最后癿十行!若要显示最后的20 行,就得要这样:

[root@www ~]# tail-n 20 /etc/man.config

范例一:如果不知道/etc/man.config有几行,即叧想列出100行以后的数据

时?

[root@www ~]# tail-n +100 /etc/man.config

范例二:持续侦测/var/log/messages的内容

[root@www ~]# tail-f /var/log/messages

<==要等到输入[crtl]-c之后才会离开tail这个命令的侦测!

2.3.5 od 命令:

[root@www ~]# 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 ;

范例一:请将/usr/bin/passwd的内容使用ASCII方式来展现!

[root@www ~]# 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 4200 004 \b

0000100 4 200 004 \b 340 \0 \0 \0 340 \0 \0 \0 005 \0 \0 \0

.....(后面省略)....

# 最左边第一栏是以 8 进位来表示bytes数。以上面范例来说,第二栏

0000020代表开头是

# 第 16 个 byes (2x8) 的内容之意。

范例二:请将/etc/issue这个文件的内容以8进位列出储存值不ASCII癿对照表

[root@www ~]# od -t oCc /etc/issue

0000000 103 145 156 164 117 123 040 162 145154 145 141 163 145 040

065

C e n t O S r e l e a s e 5

0000020 056 062 040 050 106 151 156 141 154051 012 113 145 162 156

145

. 2 ( F i n a l ) \n K e r n e

0000040 154 040 134 162 040 157 156 040 141156 040 134 155 012 012

l \ r o n a n \ m \n \n

0000057

# 如上所示,可以发现每个字符可以对应到的数值为何!

# 例如e对应癿记录数值为145,转成十进制:1x8^2+4x8+5=101。

2.4 修改文件时间与建置新档:touch;

1)作用

改变文档或目录时间;

2)用法

touch [-acfm][-d][-r ][-t ][--help] [--version][文档或目录...] 或 touch [-acfm][--help][--version][日期时间][文档或目录...]

linux中touch命令参数补充说明:使用linux中touch命令参数可更改文档或目录的日期时间,包括存取时间和更改时间。

linux中touch命令参数参数:

-a或--time=atime或--time=access或--time=use  只更改存取时间。

-c或--no-create  不建立任何文档。

-d 使用指定的日期时间,而非现在的时间。

-f 此参数将忽略不予处理,仅负责解决BSD版本touch指令的兼容性问题。

-m或--time=mtime或--time=modify 只更改变动时间。

-r 把指定文档或目录的日期时间,统统设成和参考文档或目录的日期时间相同。

-t 使用指定的日期时间,而非现在的时间。

--help 在线帮助。

--version 显示版本信息。

3)例子:

范例一:新建一个空的文档并观察时间

[root@www ~]# cd/tmp

[root@www tmp]#touch testtouch

[root@www tmp]# ls-l testtouch

-rw-r--r-- 1 rootroot 0 Sep 25 21:09 testtouch

# 注意到,这个文档的大小是0 呢!在预设的状态下,如果 touch 后面有接档

案,

# 则该档案癿三个时间(atime/ctime/mtime) 都会更新为目前的时间。若该档案

不存在,

# 则会主动的建立一个新的空的文件!例如上面这个例子!

范例二:将 ~/.bashrc 复制成为 bashrc,假设复制完全的属性,检查其日期

[root@www tmp]# cp-a ~/.bashrc bashrc

[root@www tmp]# llbashrc; ll --time=atime bashrc; ll --time=ctime

bashrc

-rw-r--r-- 1 rootroot 176 Jan 6 2007 bashrc <==这是 mtime

-rw-r--r-- 1 rootroot 176 Sep 25 21:11 bashrc <==这是 atime

-rw-r--r-- 1 rootroot 176 Sep 25 21:12 bashrc <==这是 ctime

范例三:修改案例二的 bashrc 档案,将日期调整为两天前

[root@www tmp]#touch -d "2 days ago" bashrc

[root@www tmp]# llbashrc; ll --time=atime bashrc; ll --time=ctime

bashrc

-rw-r--r-- 1 rootroot 176 Sep 23 21:23 bashrc

-rw-r--r-- 1 rootroot 176 Sep 23 21:23 bashrc

-rw-r--r-- 1 rootroot 176 Sep 25 21:23 bashrc

# 跟上个范例比较看看,本来是25 日的变成了 23 日了 (atime/mtime)~

# 不过, ctime 并没有跟着改变!

范例四:将上个范例的 bashrc 日期改为2007/09/15 2:02

[root@www tmp]#touch -t 0709150202 bashrc

[root@www tmp]# llbashrc; ll --time=atime bashrc; ll --time=ctime

bashrc

-rw-r--r-- 1 rootroot 176 Sep 15 2007 bashrc

-rw-r--r-- 1 rootroot 176 Sep 15 2007 bashrc

-rw-r--r-- 1 rootroot 176 Sep 25 21:25 bashrc

# 注意看看,日期在atime 与 mtime 都改变了,但是 ctime 则是记录目前的时

间!

2.5 文件预设权限:umask;

您知道当你建立一个新的档案或目录时,他的预设属性会是什么吗?呵呵!那就与 umask 有关了!那么 umask 是在搞什么呢?基本上, umask 就是指定『目前使用者在建立档案或目录时候的属性默认值』,那么如何得知或设定 umask 呢?他的指定条件以底下的方式来指定:语法:

[root @test root]#umask

0022

[root@vbird test]#umask 002 <==后面接 3 个数字!

[root@vbird test]#umask

0002

说明:查看 umask 数值为直接输入 umask即可,而设定呢?没错!就是 umask 之后接三个数字!那么如何来指定呢?主要还是跟 Linux 的档案属性(那九个属性, r, w, x )有关的,而且是以分数的那一个关系为例的,而有底下的规则为辅:

• 若使用者建立为『档案』则预设『没有可执行( x ) 项目』,亦即只有 rw 这两个项目,也就是最大为 666 分

--rw-rw-rw-

• 若使用者建立为『目录』,则由于 x 与是否可以进入此目录有关,因此预设为所有权限均开放,亦即为 777 分

drwxrwxrwx

那么 umask 指定的是『该默认值需要减掉的权限!』因为 r、w、x 分别是 4、2、1 分,所以啰!也就是说,当要拿掉能写的权限,就是输入 2 分,而如果要拿掉能读的权限,也就是 4 分,那么要拿掉读与写的权限,也就是 6 分,而要拿掉执行与写入的权限,也就是 3 分,这样了解吗?请问您, 5 分是什么?呵呵!就是读与执行的权限啦!如果以上面的例子来说明的话,因为 umask 为 002 ,所以 user, group 并没有被拿掉属性,不过 others 的属性被拿掉了 2 ( 也就是 w 这个属性
),那么由于当使用者:

• 建立档案时:(-rw-rw-rw-) –(--------w-) ==> -rw-rw-r--

• 建立目录时:(drwxrwxrwx) –(--------w-) ==> drwxrwxr-x

不相信吗?你只要使用 touch test然后看看这个 test 的档案属性,就可以知道了!那么如何看你这个使用者目前的 umask

呢?直接下达 umask 即可!实作看看先:

[root@vbird test]#umask

0002

[root@vbird test]#touch test1

[root@vbird test]#mkdir test2

[root@vbird test]#ls -l

-rw-rw-r-- 1 rootroot 0 Oct 22 00:00 test1

drwxrwxr-x 2 rootroot 4096 Oct 22 00:00 test2/

发现了什么?呵呵! Test1 的属性为 666-002= 664 !正确吗?是的!正确!

而 test2 这个目录呢?就是777-002 = 775 !也正确!

[root@vbird test]#umask 003

[root@vbird test]#touch test3

[root@vbird test]#mkdir test4

[root@vbird test]#ll

-rw-rw-r-- 1 rootroot 0 Oct 22 00:03 test3

drwxrwxr-- 2 rootroot 4096 Oct 22 00:03 test4/

嘿!属性又跟刚刚的不一样啰!仔细推敲一下为什么呦!test3 666-003 =663,这是

怎么一回事?! 663 应该是-rw-rw--wx 才对啊!怎么会是上面的属性!呵呵!这

里就要特别的给他强调了!『尽量不要以数字相加减啦!』容易造成类似上面的问题!

你应该要这样想(-rw-rw-rw-) -(--------wx)=-rw-rw-r--这样就对啦!了解了吗?

不要用十进制的数字喔!够能力的话,用二进制来算,不晓得的话,用 rwx 来算喔!

由上面的例子您应该很轻易的就可以发现umask 的用途!而这个 umask 可以在 /etc/bashrc 里面进行修改喔!预设的情况

之下, root 的 umask 为 022 而一般使用者则为 002 ,因为可写的权限蛮严重的,因此预设都会拿掉这个权限!此外,

因为 root 比较重要!所以为了安全的需求,其同群组的写入属性就被拿掉了!这东西对于安全性也有一定程度的贡献呦!

2.6 文件隐藏属性:chattr,lsattr;

这两个命令是用来查看和改变文件、目录属性的,与chmod这个命令相比,chmod只是改变文件的读写、执行权限,更底层的属性控制是由chattr来改变的。

chattr命令的用法:chattr[ -RVf ] [ -v version ] [ mode ] files…

最关键的是在[mode]部分,[mode]部分是由+-=和[ASacDdIijsTtu]这些字符组合的,这部分是用来控制文件的

属性。

+ :在原有参数设定基础上,追加参数。

- :在原有参数设定基础上,移除参数。

= :更新为指定参数设定。

A:文件或目录的 atime(access time)不可被修改(modified), 可以有效预防例如手提电脑磁盘I/O错误的发生。

S:硬盘I/O同步选项,功能类似sync。

a:即append,设定该参数后,只能向文件中添加数据,而不能删除,多用于服务器日志文件安全,只有root才能设定这个属性。

c:即compresse,设定文件是否经压缩后再存储。读取时需要经过自动解压操作。

d:即no dump,设定文件不能成为dump程序的备份目标。

i:设定文件不能被删除、改名、设定链接关系,同时不能写入或新增内容。i参数对于文件系统的安全设置有很大帮助。

j:即journal,设定此参数使得当通过mount参数:data=ordered或者 data=writeback 挂载的文件系统,文件在写入时会先被记录(在journal中)。如果filesystem被设定参数为 data=journal,则该参数自动失效。

s:保密性地删除文件或目录,即硬盘空间被全部收回。

u:与s相反,当设定为u时,数据内容其实还存在磁盘中,可以用于undeletion。

各参数选项中常用到的是a和i。a选项强制只可添加不可删除,多用于日志系统的安全设定。而i是更为严格的安全设定,只有superuser (root) 或具有CAP_LINUX_IMMUTABLE处理能力(标识)的进程能够施加该选项。

应用举例:

案例一:用chattr命令防止系统中某个关键文件被修改:

# chattr +i/etc/resolv.conf

然后用mv/etc/resolv.conf等命令操作于该文件,都是得到Operation not permitted 的结果。vim编辑该文件时会提示W10:Warning: Changing a readonly file错误。要想修改此文件就要把i属性去掉: chattr -i /etc/resolv.conf

# lsattr/etc/resolv.conf

会显示如下属性

----i--------/etc/resolv.conf

案例二:让某个文件只能往里面追加数据,但不能删除,适用于各种日志文件:

# chattr +a/var/log/messages

更改linux的root密码 报:passwd:Authentication token manipulation error

具体实例:

如下所示:

[root@ticket-A ~]#passwd root

Changing passwordfor user root.

New UNIX password:

Retype new UNIXpassword:

Sorry, passwordsdo not match

New UNIX password:

Retype new UNIXpassword:

passwd: Authenticationtoken manipulation error

修改如下:

[root@ticket-A ~]#chattr -i /etc/passwd

[root@ticket-A ~]#chattr -i/etc/shadow

再修改root的密码就可以。

修改完之后,再执行

[root@ticket-A ~]#chattr +i /etc/passwd

[root@ticket-A ~]#chattr +i/etc/shadow

2.7 文件特殊权限:SUID,SGID, SBIT;

文件的特殊权限SGID, SUID..SBIT

大家都知道文件和目录的权限最常见的有三个.可读(r)..可写(w)..可执行(x)..它们的级别分别是4..2..1..我们有时也会发现有些文件所属主的权限上带有一个s的标志位.目录的所属组上也带有s标志位.很多人不理解这是为什么....下面我们举例来看一下...

#ls-l /usr/bin/passwd

-rwsr-xr-x 1 root root 19876 Jul 17 2006 /usr/bin/passwd

这个文件的所属主的x标志位上变成了s,这时称为set uid..简写就是suid..其实这个文件属性也没有特殊的含义..当这个s标志位出现在一些脚本上时,它就有意义了...比方说我我们有一个脚本名为sum.sh.这个脚本的权限如下:

-rwsrwxr-x 1 root root 117 Feb 6 20:46 sum.sh

这个脚本的所属主和所属组为root.我们当然可以以root的用户的身份执行它..我们还可以看见它的所属主的标志位上有个s..其他人有读取和执行的权限.假如我们现在有个普通用户名为redhat..现在切换到redhat..执行此脚本..表面上我们看是执行成功了..其实我们是借助root用户的身份来执行它..而不是redhat..这就是suid的特性....

下满我们来说下SGID,看了上面的SUID后很容易就知道所谓SGID就是将标志s加到gid的x标志位上..称为set gid.简称sgid..在这强调一下SUID我们一般用在文件上.特别是一些脚本上...SGID用在目录上最多...比方说我以root身份创建一个目录a.给他加上sgid权限

#mkdir a

#chmod 2757 a

#ls -l

drwxr-srwx 2 root root 4096 Feb 6 21:09 a

因为我们给a目录其他人所具有的权限是可读,可写,可执行...当我们以redhat用户的身份切换到另外一个终端..进入a目录中,我们在此目录中创建一个目录b和一个文件c

[redhat@station18 a]$ mkdir b

[redhat@station18 a]$ touch c

[redhat@station18 a]$ ls -l

drwxrwsr-x 2 redhat root 4096 Feb 6 21:20 b

-rw-rw-r-- 1 redhat root 0 Feb 6 21:20 c

我们可以看到目录b和文件c的所属组都为root......当你将一个a目录置为sgid权限时候,如果其他人有读取,执行和写入的权限时,别人在此目录中创建的任何文件和目录的所属组都为a目录的所属组..但所属主还是自己...这个会经常的用到....有一点大家得注意...就是任何人在a目录中创建的东西.别人都可以删掉...这就是我们下面要讲到的SBIT....

SBIT 全称Sticky Bit.但是它只对目录有效,对文件却是无效的,它的作用就是防止别人删除对方的资料...我们举例来说明...

1)..我用root用户登录创建一个目录名为test

[root@station18 ~]# mkdir test

[root@station18 ~]# chmod o+w test/

[root@station18 ~]# ls -l

drwxr-xrwx 2 root root 4096 Feb 6 21:30 test

2)..我们切换到redhat用户登录一个终端,创建一个目录a..

[redhat@station18 test]$ mkdir a

3).我们在切换到xiaoming用户登录一个终端,创建一个目录b...

[xiaoming@station18 test]$ mkdir b

[xiaoming@station18 test]$ ls -l

drwxrwxr-x 2 redhat redhat 4096 Feb 6 21:32 a

drwxrwxr-x 2 xiaoming xiaoming 4096 Feb 6 21:31 b

我们可以以任何用户的身份进入test目录发现可以删除a和b目录...这样就乱了套...别人的目录你岂能随便删的...这时我们就需要将test目录加上SBIT权限了...

[root@station18 ~]# chmod 1757 test/

[root@station18 ~]# ls -l

drwxr-xrwt 4 root root 4096 Feb 6 21:42 test

我们在用别的用户登录进入test目录他就删不掉别人的资料了,系统会提示rm:cannot remove directory `a': Operation not permitted..意思是你权限不够....呵呵...这样别人就没辙了....我测试过成功的...

下面我来说一下关于SUIDSGID SBIT权限的设定...

SUID为4

SGID为2

SBIT为1

我在上面设定一些文件或目录的权限你可能看不懂,,下面我来详细讲解...

假如我们有个文件叫file.有一个目录叫test..file它的权限是644..test的权限是755

1)..如果我们想把file加上suid权限的话执行此命令

#chmod 4755 file

2)..如果我们想把test目录加上sgid的话执行此命令

#chmod 2755 test/

3).如果我们想把test目录加上sbit权限的话执行此命令

#chmod 1755 test/

4)..大家可以看得出来s与t都是取代x权限的...

5)..如果不想让test具备SUID和SGID权限执行此命令

#chmod 7666 file

#ls -l

-rwSrwSrwT 1 root root 0 Feb 6 21:49 file

这里的S和T就代表空..不具备其他人执行的权限...7666也就是说用户,组,以及其他的人都不具备x的权限,除了root.任何人修改不了此文件...

这儿我用数字代替给文件加一些 权限....我们也可以用别的方法.比方说..我们给file文件加上suid权限

#chmod u=rwxs,o=rx file

给test目录加上SGID权限和other可读取写入执行权限

#chmod g+s,o=wrx test/

给test目录加上SBIT权限和other可读取写入执行权限

#chmod o=rwxt test/

2.8 观察文件类型:file;

[root@www ~]# file~/.bashrc

/root/.bashrc:ASCII text <==告诉我们是 ASCII 的纯文本档啊!

[root@www ~]# file/usr/bin/passwd

/usr/bin/passwd:setuid ELF 32-bit LSB executable, Intel 80386, version 1

(SYSV), forGNU/Linux 2.6.9, dynamically linked (uses shared libs), for

GNU/Linux 2.6.9,stripped

# 执行文件的数据可就多的不得了!包括这个档案的 suid 权限、兼容于 Intel

386

# 等级的硬件平台、使用的是Linux 核心 2.6.9 的动态函式库链接等等。

[root@www ~]# file/var/lib/mlocate/mlocate.db

/var/lib/mlocate/mlocate.db:data <== 这是 data 文档!

2.9 脚本文件名的搜寻:which;

1) 作用:

在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。也就是说,使用which命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。

2) 用法:

which [-a] command

命令参数:

-n 指定文件名长度,指定的长度必须大于或等于所有文件中最长的文件名。

-p 与-n参数相同,但此处的包括了文件的路径。

-w 指定输出时栏位的宽度。

-V 显示版本信息

3) 案例:

实例1:查找文件、显示命令路径

命令:

which lsmod

输出:

[root@localhost~]# which pwd

/bin/pwd

[root@localhost~]# which adduser

/usr/sbin/adduser

[root@localhost~]#

说明:

which 是根据使用者所配置的PATH 变量内的目录去搜寻可运行档的!所以,不同的 PATH 配置内容所找到的命令当然不一样的!

实例2:用 which 去找出 which

命令:

which which

输出:

[root@localhost~]# which which

alias which='alias| /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

/usr/bin/which

[root@localhost~]#

说明:

竟然会有两个 which ,其中一个是 alias 这就是所谓的『命令别名』,意思是输入 which 会等於后面接的那串命令!

2.10 文件的搜寻: whereis, locate, find;

2.10.1 whereis命令:

1) 用途:

whereis命令用来查找命令的位置,包括执行文件、源代码和手册页文件(locate the binary, source, and manual page files for a command)。如果要查找任意文件的所在位置,可以使用locate或者find等命令。

2) 用法:

whereis[-bfmsu][-B ...][-M ...][-S ...][文件...]

补充说明:whereis指令会在特定目录中查找符合条件的文件。这些文件的烈性应属于原始代码,二进制文件,或是帮助文件。

参 数:

-b 只查找二进制文件。

-B 只在设置的目录下查找二进制文件。

-f 不显示文件名前的路径名称。

-m 只查找说明文件。

-M 只在设置的目录下查找说明文件。

-s 只查找原始代码文件。

-S 只在设置的目录下查找原始代码文件。

-u 查找不包含指定类型的文件。

3) 案例:

示例一

[root@jfht ~]#whereis whereis

whereis:/usr/bin/whereis /usr/share/man/man1/whereis.1.gz

[root@jfht ~]#whereis -b whereis

whereis:/usr/bin/whereis

[root@jfht ~]#whereis -m whereis

whereis:/usr/share/man/man1/whereis.1.gz

[root@jfht ~]#whereis -s whereis

whereis:

[root@jfht ~]#

示例二

[root@jfht ~]#whereis mysql

mysql:/usr/bin/mysql /usr/lib/mysql /usr/include/mysql /usr/share/mysql/usr/share/man/man1/mysql.1.gz

[root@jfht ~]#whereis -b mysql

mysql:/usr/bin/mysql /usr/lib/mysql /usr/include/mysql /usr/share/mysql

[root@jfht ~]# whereis-m mysql

mysql:/usr/share/man/man1/mysql.1.gz

[root@jfht ~]#whereis -s mysql

mysql:

[root@jfht ~]#

2.10.2 locate命令:

1) 用途

查找文档

2) 用法

locate [-q] [-d ][--database=]

locate [-r ][--regexp=]

locate [-qv] [-o ][--output=]

locate [-e ] [-f ]<[-l ] [-c]

<[-U ] [-u]>

locate [-Vh][--version] [--help]

使用说明:

Linux系统中,合理使用locate命令,可以使用户可以很快速的搜寻档案系统内是否有指定的档案。具体方法是,首先建立一个包括系统内所有档案名称及路径的资料库,之后当寻找时就只需查询这个资料库,而不必实际深入档案系统之中了。在一般的 distribution 之中,资料库的建立都被放在 contab 中自动执行。

一般使用者在使用时只要用

# locateyour_file_name

的型式就可以了。 参数:

-u

-U

建立资料库,-u 会由根目录开始,-U 则可以指定开始的位置。

-e

将排除在寻找的范围之外。

-l

如果 是 1,则启动安全模式。在安全模式下,使用者不会看到权限无法看到的档案。这会始速度减慢,因为 locate 必须至实际的档案系统中取得档案的权限资料。

-f

将特定的档案系统排除在外,例如我们没有到理要把 proc 档案系统中的档案放在资料库中。

-q

安静模式,不会显示任何错误讯息。

-n

至多显示 个输出。

-r

使用正规运算式 做寻找的条件。

-o

指定资料库存的名称。

-d

指定资料库的路径

-h

显示辅助讯息

-v

显示更多的讯息

-V

显示程式的版本讯息 范例:

locate chdrv:寻找所有叫 chdrv 的档案

locate -n 100a.out:寻找所有叫 a.out 的档案,但最多只显示 100 个

locate -u:建立资料库

2.10.3 find命令:

1) 用途

扫描硬盘进行文档查找;

2) 用法

find path -option [ -print ] [ -exec -ok command ] {} \;

find命令的参数;

pathname: find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。

-print: find命令将匹配的文件输出到标准输出。

-exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' { } \;,注意{ }和\;之间的空格。

-ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。

#-print 将查找到的文件输出到标准输出

#-exec command {} \; —–将查到的文件执行command操作,{} 和 \;之间有空格

#-ok 和-exec相同,只不过在操作前要询用户

因为find命令会根据我们给的option,也就是寻找条件从我们给出的目录开始对其中文件及其下子目录中的文件进行递归搜索,所以我觉的这个地方说是“起始目录”是非常好的。

该命令中的寻找条件可以是一个用逻辑运算符not、and、or 组成的复合条件。逻辑运算符 and、or、not 的含义为:

(1) and:逻辑与,在命令中用“-a”表示,是系统缺省的选项,表示只有当所给的条 件都满足时,寻找条件才算满足。例如:

find –name ’tmp’–xtype c -user ’inin’

% 该命令寻找三个给定条件都满足的所有文件

(2) or:逻辑或,在命令中用“-o”表示。该运算符表示只要所给的条件中有一个满足 时,寻找条件就算满足。例如:

find –name ’tmp’–o –name ’mina*’

% 该命令查询文件名为’tmp’或是匹配’mina*’的所有文件。

(3) not:逻辑非,在命令中用“!”表示。该运算符表示查找不满足所给条件的文件 。例如:

find ! –name ’tmp’

% 该命令查询文件名不是’tmp’的所有文件。

需要说明的是:当使用很多的逻辑选项时,可以用括号把这些选项括起来。为了避免Shell本身对括号引起误解,在话号前需要加转义字符“\”来去除括号的意义。例:

find \(–name ’tmp’–xtype c -user ’inin’ \)

我觉的现在我应该说下出了查询条件,在find中的option的内容了:

在option中,具体有参数:

-name ’字串’ 查找文件名匹配所给字串的所有文件,字串内可用通配符 *、?、[ ]。

-lname ’字串’ 查找文件名匹配所给字串的所有符号链接文件,字串内可用通配符 *、?、[ ]。

-gid n 查找属于ID号为 n 的用户组的所有文件。

-uid n 查找属于ID号为 n 的用户的所有文件。

-group ’字串’ 查找属于用户组名为所给字串的所有的文件。

-user ’字串’ 查找属于用户名为所给字串的所有的文件。

-empty 查找大小为 0的目录或文件。

-path ’字串’ 查找路径名匹配所给字串的所有文件,字串内可用通配符*、?、[ ]。

-perm 权限 查找具有指定权限的文件和目录,权限的表示可以如711,644。

-size n[bckw] 查找指定文件大小的文件,n后面的字符表示单位,缺省为 b,代表512字节的块。

-type x 查找类型为 x 的文件,x 为下列字符之一:

b 块设备文件

c 字符设备文件

d 目录文件

p 命名管道(FIFO)

f 普通文件

l 符号链接文件(symboliclinks)

s socket文件

-xtype x 与 -type 基本相同,但只查找符号链接文件。

以时间为条件查找

-amin n 查找n分钟以前被访问过的所有文件。

-atime n 查找n天以前被访问过的所有文件。

-cmin n 查找n分钟以前文件状态被修改过的所有文件。

-ctime n 查找n天以前文件状态被修改过的所有文件。

-mmin n 查找n分钟以前文件内容被修改过的所有文件。

-mtime n 查找n天以前文件内容被修改过的所有文件。

-print:将搜索结果输出到标准输出。

例子:在root以及子目录查找不包括目录/root/bin的,greek用户的,文件类型为普通文件的,3天之前的名为test-find.c的文件,并将结构输出,find命令如下:

find / -name"test-find.c" -type f -mtime +3 -user greek -prune /root/bin -print

当然在这其中,-print是一个默认选项,我们不必刻意去配置它。

我们再看一下exec选项:

-exec:对搜索的结构指令指定的shell命令。注意格式要正确:"-exec命令 {} \;"

在}和\之间一定要有空格才行;

{}表示命令的参数即为所找到的文件;命令的末尾必须以“ \;”结束。

例子:对上述例子搜索出来的文件进行删除操作,命令如下:

find / -name"test-find.c" -type f -mtime +3 -user greek -prune /root/bin -exec rm{} \;

find命令指令实例:

find . - name‘main*’ - exec more {} \;

% 查找当前目录中所有以main开头的文件,并显示这些文件的内容。

find . \(- namea.out - o - name ‘*.o’\)> - atime +7 - exec rm {} \;

% 删除当前目录下所有一周之内没有被访问过的a .out或*.o文件。

% 命令中的“.”表示当前目录,此时find 将从当前目录开始,逐个在其子目录中查找满足后面指定条件的文件。

% “\(” 和 “\)” 表示括号(),其中的 “\” 称为转义符。之所以这样写是由于对Shell 而言,(和)另有不同的含义,而不是这里的用于组合条件的用途。

% “-name a.out” 是指要查找名为a.out的文件;

% “-name ‘*.o’” 是指要查找所有名字以 .o 结尾的文件。

这两个 -name 之间的 -o 表示逻辑或(or),即查找名字为a.out或名字以 .o结尾的文件。

% find命令在当前目录及其子目录下找到这佯的文件之后,再进行判断,看其最后访问时间是否在7天以前(条件 -atime +7),若是,则对该文件执行命令 rm(-exec rm {} \;)。

其中 {} 代表当前查到的符合条件的文件名,\;则是语法所要求的。

% 上述命令中第一行的最后一个\ 是续行符。当命令太长而在一行写不下时,可输入一个 \,之后系统将显示一个 >,指示用户继续输入命令。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: