现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

SHELL命令学习笔记

2013-04-17 22:15 工业·编程 ⁄ 共 8345字 ⁄ 字号 暂无评论

一、mkdir命令
1、用途:创建目录
2、参数:
(1)、-p :如果路径中的某些目录不存在,则会自动创建目录,默认的mode由执行环境中的umask决定,即mode = 0777 - umask;无参数则路径中的目录不存在则将无法创建
(2)、-m : 指定目录的权限;
3、例子:
    示例一
    [root@jfht ~]# umask
    0022
    [root@jfht ~]# mkdir dir1
    [root@jfht ~]# ls-l dir1
    总计 0
    ls命令跟上-d参数才能打印目录本身的信息。
    [root@jfht ~]# ls-ld dir1
    drwxr-xr-x 2 root root 4096 07-20 20:44 dir1
    权限设置mode=0755=0777-0022
    [root@jfht ~]#
    示例二
    [root@jfht ~]# mkdir-m 0700 dir2
    [root@jfht ~]# ls-ld dir2
    drwx------ 2 root root 4096 07-20 20:47 dir2
    [root@jfht ~]#
    示例三
    [root@jfht ~]# mkdir dir3/x/y/z
    mkdir: 无法创建目录 “dir3/x/y/z”: 没有那个文件或目录
    [root@jfht ~]# mkdir-p dir3/x/y/z
    [root@jfht ~]# ls-ld dir3
    drwxr-xr-x 3 root root 4096 07-20 20:48 dir3
    [root@jfht ~]# ls-ld dir3/x
    drwxr-xr-x 3 root root 4096 07-20 20:48 dir3/x
    [root@jfht ~]# ls-ld dir3/x/y
    drwxr-xr-x 3 root root 4096 07-20 20:48 dir3/x/y
    [root@jfht ~]# ls-ld dir3/x/y/z
    drwxr-xr-x 2 root root 4096 07-20 20:48 dir3/x/y/z
    [root@jfht ~]#
    示例四 一个命令创建项目的目录结构
    [root@jfht ~]# mkdir-p project/{lib/ext,bin,src,doc/{html,info,pdf},demo/stat/a}
    [root@jfht ~]# tree project/
    project/
    |-- bin
    |-- demo
    | `-- stat
    | `-- a
    |-- doc
    | |-- html
    | |-- info
    | `-- pdf
    |-- lib
    | `-- ext
    `-- src
    11 directories, 0 files
二、cp命令
1、用途:复制文件或者目录
2、参数
a :相当于 -pdr 的意思;
-d :若来源文件为连结文件的属性(link file),则复制连结文件属性而非档案本身;
-f :为强制 (force) 的意思,若有重复或其它疑问时,不会询问使用者,而强制复制;
-i :若目的檔(destination)已经存在时,在覆盖时会先询问是否真的动作!
-l :进行硬式连结 (hard link) 的连结档建立,而非复制档案本身;
-p :连同档案的属性一起复制过去,而非使用预设属性;
-r :递归持续复制,用于目录的复制行为;
-s :复制成为符号连结文件 (symbolic link),亦即『快捷方式』档案;
-u :若 destination 比 source 旧才更新 destination !
3、例子
    范例一:将家目录下的 .bashrc 复制到/tmp 下,并更名为 bashrc
    [root@linux ~]# cd/tmp
    [root@linux tmp]# cp~/.bashrc bashrc
    [root@linux tmp]# cp-i~/.bashrc bashrc
    # 重复作两次动作,由于 /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
    # 可以将多个数据一次复制到同一个目录去!
    这个 cp 的功能很多,而由于我们常常在进行一些数据的复制,所以也会常常用到这个指令的。 一般来说,我们如果去复制别人的数据 (当然,该档案您必须要有 read 的权限才行啊! ^_^) 时, 总是希望复制到的数据最后是我们自己的,所以,在预设的条件中, cp 的来源档与目的档的权限是不同的,目的档的拥有者通常会是指令操作者本身。举例来说, 上面的范例二中,由于我是 root 的身份,因此复制过来的档案拥有者与群组就改变成为 root 所有了! 这样说,可以明白吗?! ^_^
    由于具有这个特性,因此,当我们在进行备份的时候,某些需要特别注意的特殊权限档案, 例如密码文件 (/etc/shadow) 以及一些设定档,就不能直接以 cp 来复制,而必须要加上-a 或者是 -p 等等可以完整复制档案权限的参数才行!另外,如果您想要复制档案给其它的使用者, 也必须要注意到档案的权限(包含读、写、执行以及档案拥有者等等), 否则,其它人还是无法针对您给予的档案进行修订的动作喔!注意注意!
    至于上面的范例当中,第四个范例是最有趣的,使用 -l 及 -s 都会建立所谓的连结档 (link file), 但是这两种连结档确有不一样的展现情况。这是怎么一回事啊? 那个-l 就是所谓的 hardlink ,至于-s 则是 symboliclink ,鸟哥这里先不介绍, 因为这个涉及i-node 的相关知识,我们还没有介绍到,下一章再来讨论这个link 的问题喔! 总之,由于 cp 有种种的档案属性与权限的特性,所以,在复制时,您必须要清楚的了解到:
    是否需要完整的保留来源档案的信息?
    来源档案是否为连结档 (symbolic link file)?
    来源档是否为特殊的档案,例如 FIFO, socket 等?
    来源文件是否为目录?
三、mv命令
(1)、用途:移动或更名文件或目录
(2)、参数:
-b或--backup 若需覆盖文档,则覆盖前先行备份。
-f或--force 若目标文档或目录和现有的文档或目录重复,则直接覆盖现有的文档或目录。
-i或--interactive 覆盖前先行询问用户。
-S或
--suffix= 和-b参数一并使用,可指定备份文档的所要附加的字尾。
-u或--update 在移动或更改文档名时,若目标文档已存在,且其文档日期比源文档新,则不覆盖目标文档。
-v或--verbose 执行时显示周详的信息。
-V=或
--version-control= 和-b参数一并使用,可指定备份的方法。
--help 显示帮助。
--version 显示版本信息。
(3)、例子
    [root@xm_41 mv]# ll
    总计 8
    -rw-r--r-- 1 root root 5 10-15 15:25 into
    -rw-r--r-- 1 root root 4 10-15 15:25 out
    [root@xm_41 mv]# mv-b into out
    mv:是否覆盖“out”? y
    [root@xm_41 mv]# ll
    总计 8
    -rw-r--r-- 1 root root 5 10-15 15:25 out
    -rw-r--r-- 1 root root 4 10-15 15:25 out~
    用-b参数的时候,会对覆盖的文件进行自动的备份,默认是后面加~;此时覆盖的时候还会进行提示
    [root@xm_41 mv]# mv-b-S bak into out
    mv:是否覆盖“out”? y
    [root@xm_41 mv]# ll
    总计 4
    -rw-r--r-- 1 root root 0 10-15 15:28 out
    -rw-r--r-- 1 root root 5 10-15 15:25 outbak
    若有参数-b同时加入-S的参数并在后面指定备份加的字符
    [root@xm_41 mv]# mv-b-S bak into out
    mv:是否覆盖“out”? y
    [root@xm_41 mv]# ll
    总计 4
    -rw-r--r-- 1 root root 0 10-15 15:28 out
    -rw-r--r-- 1 root root 5 10-15 15:25 outbak
    若是加参数-f就不会再进行提示;默认情况是-i进行询问;
    [root@xm_41 mv]# mv-u out outbak
    [root@xm_41 mv]# ll
    总计 4
    -rw-r--r-- 1 root root 0 10-15 15:30 out
    -rw-r--r-- 1 root root 5 10-15 15:31 outbak
    采用-u的参数,发现out比outbak旧,才是就不进行覆盖了
        [root@xm_41 mv]# mv-u out outbak
        [root@xm_41 mv]# ll
        总计 4
        -rw-r--r-- 1 root root 0 10-15 15:30 out
        -rw-r--r-- 1 root root 5 10-15 15:31 outbak
        mv可以用来更改名字,若是指定文件或目录是不存在的
四、rm命令
(1)、用途:删除文件或者目录
(2)、参数
-d或--directory 直接把欲删除的目录的硬连接数据删成0,删除该目录。
-f或--force 强制删除文件或目录。
-i或--interactive 删除既有文件或目录之前先询问用户。
-r或-R或--recursive 递归处理,将指定目录下的所有文件及子目录一并处理。
-v或--verbose 显示指令执行过程。
--help 在线帮助。
--version 显示版本信息
(3)、例子(才用法同mv的例子差不多,不在一一进行举例)
五、ls命令
(1)、用途:列出目录
(2)、参数
-a 列出目录下的所有文件,包括以 . 开头的隐含文件。
-b 把文件名中不可输出的字符用反斜杠加字符编号(就象在C语言里一样)的形式列出。
-c 输出文件的 i 节点的修改时间,并以此排序。
-d 将目录象文件一样显示,而不是显示其下的文件。
-e 输出时间的全部信息,而不是输出简略信息。
-f -U 对输出的文件不排序。
-g 无用。
-i 输出文件的 i 节点的索引信息。
-k 以 k 字节的形式表示文件的大小。
-l 列出文件的详细信息。
-m 横向输出文件名,并以“,”作分格符。
-n 用数字的 UID,GID 代替名称。
-o 显示文件的除组信息外的详细信息。
-p -F 在每个文件名后附上一个字符以说明该文件的类型,“*”表示可执行的普通
文件;“/”表示目录;“@”表示符号链接;“|”表示FIFOs;“=”表示套
接字(sockets)。
-q 用?代替不可输出的字符。
-r 对目录反向排序。
-s 在每个文件名后输出该文件的大小。
-t 以时间排序。
-u 以文件上次被访问的时间排序。
-x 按列输出,横向排序。
-A 显示除 “.”和“..”外的所有文件。
-B 不输出以 “~”结尾的备份文件。
-C 按列输出,纵向排序。
-G 输出文件的组的信息。
-L 列出链接文件名而不是链接到的文件。
-N 不限制文件长度。
-Q 把输出的文件名用双引号括起来。
-R 列出所有子目录下的文件。
-S 以文件大小排序。
-X 以文件的扩展名(最后一个 . 后的字符)排序。
-1 一行只输出一个文件。
--color=no 不显示彩色文件名
--help 在标准输出上显示帮助信息。
--version 在标准输出上输出版本信息并退出。
(3)、例子
    只列出子目录
    1. ls -F| grep/$ 或者 aliassub= "ls -F | grep /$"(linux)
    2. ls -l| grep"^d" 或者 ls-lL| grep "^d"(Solaris)
    计算当前目录下的文件数和目录数
    下面命令可以分别计算当前目录下的文件和目录个数:
    # ls -l *|grep"^-"|wc-l---- to count files
    # ls -l *|grep"^d"|wc-l----- to countdir
    显示彩色目录列表
    打开/etc/bashrc, 加入如下一行:
    alias ls="ls --color"
    下次启动bash时就可以像在Slackware里那样显示彩色的目录列表了, 其中颜色的含义如下:
    1. 蓝色-->目录
    2. 绿色-->可执行文件
    3. 红色-->压缩文件
    4. 浅蓝色-->链接文件
    5. 灰色-->其他文件
    ls -tl --time-style=full-iso sshd
    ls -ctl --time-style=long-iso
    ls 命令的含义是list显示当前目录中的文件名字。注意不加参数它显示除隐藏文件外的所有文件及目录的名字。
           1)ls –a 显示当前目录中的所有文件,包含隐藏文件
    ]# ls –a
    . .gnome2.nautilus
    .. .gnome2_private oracle_rpm
    .bash_profile .gtkrc-1.2-gnome2 tnsnames.ora
    .bashrc .ICEauthority types.h
    注意隐藏文件是在文件名字以“.”(英文句号)开头的文件。
           2)ls –l 显示文件及其详细信息。
    ]# ls –l
    total 5
    -rw-r--r-- 1 root root 1668 Oct 3 2007 anaconda-ks.cfg
    drwxr-xr-x 2 root root 4096 Nov 6 00:04 aa
    显示的文件详细信息分别代表什么呢?以上面蓝色部分为例。
    total 5 代表当前目录下文件大小的总和为5K(每个目录的大小都按4K算)
    drwxr-xr-x 第一个字符有3种情况:“-”表示普通文件,“d”代表目录,“l”代表连接文件,“b”代表设备文件。
    后面的9个字符每3个为一组,分别代表文件所有者、文件所有者所在用户组、其它用户对文件拥有的权限。每组中3个字符分别代表读、写、执行的权限,若没有其中的任何一个权限则用“-”表示。执行的权限有两个字符可选“x”代表可执行,“s”代表套接口文件。
    紧接着的数字2代表 “aa”这个目录下的目录文件数目(这个数目=隐藏目录数目+普通目录数目)。我们进入“aa”目录用命令 ls –al (为了看到隐藏文件我们加上-a这个参数)
    ]# ls -al
    total 8
    drwxr-xr-x 2 root root 4096 Nov 6 00:04.
    drwxr-x--- 14 root root 4096 Nov 6 00:04..
    (上面的第3行中的2代表当前目录中有子目录2个,即.和..上面的第4行中的14代表这个目录的上一层目录中有14个子目录。)
    再接下来的root代表这个文件(目录)的属主为 用户root
    再接下来的root代表这个文件(目录)所属的用户组为 组root
    4096 代表文件的大小(字节数),目录的大小总是为4096字节。
    Nov 6 00:04 代表文件(目录)的修改时间。
    aa代表文件(目录)在名字。
    3)文件名颜色的含义
    默认色代表普通文件。 例:install.log
    绿色代表可执行文件。 例:rc.news
    红色代表tar包文件。 例:vim-7.1.tar.bz2
    蓝色代表目录文件。 例:aa
    水红代表图象文件。 例:Sunset.jpg
    青色代表链接文件。 例:rc4.d (此类文件相当于快捷方式)
    黄色代表设备文件。 例:fd0
    4)几个比较常用的参数。
    -t 按最后修改时间排序。
    -S 按文件大小排序。(大写的S)
    -r 排序时按倒序。
    -h 显示文件大小时增加可读性 (例:1K 234M 2G)

给我留言

留言无头像?