码迷,mamicode.com
首页 > 系统相关 > 详细

class-4 Linux文件系统(二)及IO重定向

时间:2016-08-01 14:06:40      阅读:573      评论:0      收藏:0      [点我收藏+]

标签:linux基础

一、文件系统(二)

  1、文件通配符

       作用:可以批量的选择出符合要求的文件或目录

        *  匹配零个或多个字符

         ?  匹配任何单个字符

         ~  当前用户家目录

        ~username  用户家目录

[root@6 /]# cd ~lvasu
[root@6 lvasu]# ls

        ~+  当前工作目录

        ~- 前一个工作目录

            # ls  ~-/issue

     [root@6 ~]# ls  
a    anaconda-ks.cfg  install.log         x       模板  图片  下载  桌面
abc  df               install.log.syslog  公共的  视频  文档  音乐
[root@6 ~]# ls ~+                           ##表示当前工作目录
a    anaconda-ks.cfg  install.log         x       模板  图片  下载  桌面
abc  df               install.log.syslog  公共的  视频  文档  音乐
[root@6 ~]# cd /
[root@6 /]# ls
bin   dev  home  lib64       media  mnt  opt   root  selinux  sys      tmp  var
boot  etc  lib   lost+found  misc   net  proc  sbin  srv      testdir  usr
[root@6 /]# ls ~-                           ## 表示前一个工作目录
a    anaconda-ks.cfg  install.log         x       模板  图片  下载  桌面
abc  df               install.log.syslog  公共的  视频  文档  音乐

        [0-9] 匹配一个数字范围

        [a-z] :大写和小写字母

        [A-Z] :大写字母

       [wxc] 匹配列表中的任何的一个字符

       [^wxc]  匹配列表中的所有字符以外的字符

root@6 ~]# touch a{1..4}
[root@6 ~]# ls
a   a2  a4   anaconda-ks.cfg  install.log         x       模板  图片  下载  桌面
a1  a3  abc  df               install.log.syslog  公共的  视频  文档  音乐
[root@6 ~]# ls a[1-4]
a1  a2  a3  a4

       预定义的字符类: :#man 7 glob

          [:digit:] :任意数字,相当于0-9

          [:lower:] :任意小写字母

          [:upper:]:  任意大写字母

          [:alpha:]:  任意大小写字母

          [:alnum:] :任意数字或字母

          [:space:] :空格

          [:punct:] :标点符号

[root@7 ~]# touch fa fA fb fB fc fC fd fD
[root@7 ~]# ls f[a-z]
fa  fA  fb  fB  fc  fC  fd  fD
[root@7 ~]# ls f[A-Z]
fA  fb  fB  fc  fC  fd  fD
[root@7 ~]# ls f[a-Z]
fa  fA  fb  fB  fc  fC  fd  fD
[root@7 ~]# ls f[A-z]
fA  fb  fB  fc  fC  fd  fD

2、创建空文件和刷新时间

     touch 命令:      无法使用globbing

               touch [OPTION]... FILE...

    -a: 变 仅改变 atime

    -m: 变 仅改变 mtime

    -t :STAMP:

          [[CC]YY]MMDDhhmm[.ss]

[root@6 ~]# touch -at 1506010800.00 a1
[root@6 ~]# touch -mt 1406010800.00 a1
[root@6 ~]# stat a1
 File: "a1"
 Size: 0         Blocks: 0          IO Block: 4096   普通空文件
Device: 802h/2050d	Inode: 2752743     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2015-06-01 08:00:00.000000000 +0800
Modify: 2014-06-01 08:00:00.000000000 +0800
Change: 2016-07-28 20:27:20.517989998 +0800
[root@6 ~]# touch -t 1906010800.00 a1   #-t命令修改a、m时间
[root@6 ~]# stat a1
 File: "a1"
 Size: 0         Blocks: 0          IO Block: 4096   普通空文件
Device: 802h/2050d	Inode: 2752743     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2019-06-01 08:00:00.000000000 +0800
Modify: 2019-06-01 08:00:00.000000000 +0800
Change: 2016-07-28 20:29:05.724988876 +0800

    -c:  如果文件不存在,则不予创建

[root@6 ~]# touch -c a5
[root@6 ~]# ls
a   a2  a4   anaconda-ks.cfg  install.log         x       模板  图片  下载  桌面
a1  a3  abc  df               install.log.syslog  公共的  视频  文档  音乐

    # touch f?   已存在的文件刷新时间

[root@6 ~]# stat a1
File: "a1"
Size: 0         Blocks: 0          IO Block: 4096   普通空文件
Device: 802h/2050d	Inode: 2752743     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2016-07-28 20:12:06.179989457 +0800
Modify: 2016-07-28 20:12:06.179989457 +0800
Change: 2016-07-28 20:12:06.179989457 +0800
[root@6 ~]# touch a1
[root@6 ~]# stat a1
File: "a1"
 Size: 0         Blocks: 0          IO Block: 4096   普通空文件
Device: 802h/2050d	Inode: 2752743     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2016-07-28 20:17:46.504989721 +0800
Modify: 2016-07-28 20:17:46.504989721 +0800
Change: 2016-07-28 20:17:46.504989721 +0800

    touch {a..d}  

[root@7 ~]# touch {a-d}
[root@7 ~]# ls
{a-d}            fa  fb  fc  fd  initial-setup-ks.cfg  模板  图片  下载  桌面
anaconda-ks.cfg  fA  fB  fC  fD  公共

   无法使用globbing

[root@6 ~]# touch b[1-3]
[root@6 ~]# ls
anaconda-ks.cfg  install.log         x       模板  图片  下载  桌面
b[1-3]           install.log.syslog  公共的  视频  文档  音乐

    3、复制文件和目录cp

         CP是较常用的复制命令

        3.1、使用格式:

    1、cp [OPTION]... [-T] SOURCE DEST

    2、cp [OPTION]... SOURCE... DIRECTORY

    3、cp [OPTION]... -t DIRECTORY SOURCE...

    4、cp SRC DEST

          源文件是文件时:

              当目标不存在时,则新建一个文件,并将内容复制到目标文件中。

              当目标存在时,

                如果目标是一个普通文件,则将源文件的内容复制到目标文件中

                如果目标是一个目录文件,则在目录下 创建一个和源文件相同的文件,同样将源文件的内容复制到目标文件中

    5、cp SRC... DEST

          SRC... :多个文件

               目标必须存在,且为目录

    6、cp SRC DEST

         源文件是目录:此时使用选项:-r

             如果目标不存在:则创建指定目录,复制源文件目录中所有文件至目标目录中;

             如果目标目录存在:

                      如果是文件:报错

                      如果目标是目录:复制内容

       3.2、cp 常用选项

     -i :交互式

     -r, -R:  递归复制目录及内部的所有内容;

     -a:  归档,相当于-dR --preserv=all

     -d :--no-dereference --preserv=links 不复制原文件,只复制链接名

 保留连接属性

[root@7 testdir]# ls -l stderr /root/stderr
-rw-------. 1 root root  0 7月  28 11:49 /root/stderr
lrwxrwxrwx. 1 root root 15 7月  27 10:56 stderr -> /proc/self/fd/2
[root@7 testdir]# cp -d stderr /boot/std       ##保留链接属性
[root@7 testdir]# ls -l stderr /boot/std
lrwxrwxrwx. 1 root root 15 7月  28 11:54 /boot/std -> /proc/self/fd/2
lrwxrwxrwx. 1 root root 15 7月  27 10:56 stderr -> /proc/self/fd/2

     --preserv[=ATTR_LIST]

    mode:          权限

    ownership:   属主属组

    timestamp:

    links

    xattr          附加属性  

    context       注释

    al

[root@6 ~]# cp --preserv=mode b /testdir/b
cp:是否覆盖"/testdir/b"? y
[root@6 ~]# ls -l /testdir/b a
-rw-r--r--. 1 root root 49 7月  28 17:51 a
-rw-r--r--. 1 root root 49 7月  29 09:39 /testdir/b
[root@6 ~]# cp --preserv=timestamp b /testdir/b
cp:是否覆盖"/testdir/b"? y
[root@6 ~]# stat /testdir/b a
 File: "/testdir/b"
 Size: 49        	Blocks: 8          IO Block: 4096   普通文件
Device: 803h/2051d	Inode: 13          Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2016-07-29 09:35:27.631995848 +0800
Modify: 2016-07-28 17:51:21.980993419 +0800
Change: 2016-07-29 09:40:29.380996431 +0800
 File: "a"
 Size: 49        	Blocks: 8          IO Block: 4096   普通文件
Device: 802h/2050d	Inode: 2752661     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2016-07-29 09:35:27.631995848 +0800
Modify: 2016-07-28 17:51:21.980993419 +0800
Change: 2016-07-29 09:31:38.572996510 +0800

 当要使用多个参数,中间用,逗号隔开

[root@6 ~]# touch a
[root@6 ~]# cp --preserv=timestamp,mode  a /testdir/a
[root@6 ~]# ls a /testdir/a
a  /testdir/a
[root@6 ~]# ll a /testdir/a
-rw-r--r--. 1 root root 0 7月  29 10:18 a
-rw-r--r--. 1 root root 0 7月  29 10:18 /testdir/a

     -p:  等同--preserv=mode,ownership,timestamp

     -v: --verbose -v: --verbose

     -f: --force

     -n:如果已存在的文件,则不执行操作

         # cp  --preserv=mode,links

   

4、命令别名

    1、显示当前shell 进程所有可用的命令别名

            #alias

[root@6 ~]# alias   ls=‘ls /‘
[root@6 ~]# ls
bin   dev  home  lib64	    media  mnt  opt   root  selinux  sys   testdir  usr
boot  etc  lib	lost+found  misc   net  proc  sbin  srv      test  tmp      var
[root@6 ~]# unalias ls
[root@6 ~]# ls
a	b	     install.log.syslog  公共的  视频	文档  音乐
anaconda-ks.cfg  install.log  x	 模板	 图片	下载  桌面

    2、定义别名NAME ,其相当于执行命令VALUE; ;

         #alias NAME=‘VALUE‘

    3、在命令行中定义的别名,仅对当前shell 进程有效

    4、如果想永久有效,要定义在配置文件中

         仅对当前用户:~/.bashrc

         对所有用户有效:/etc/bashrc

    5、编辑配置给出的新配置不会立即生效;

    6、bash 进程重新读取配置文件:

         source /path/to/config_file. /path/to/config_file

    7、撤消别名:unalias

         8、unalias [-a] name [name ...]

    9、如果别名同原命令同名,如果要执行原命令,可使用

    “\COMMAND”

    ‘COMMAND’

      /PATH/COMMAND :外部命令

 [root@6 sysconfig]# type ls
ls is aliased to `ls --color=auto‘
[root@6 sysconfig]# cd
[root@6 ~]# \ls
a   a2	a4   anaconda-ks.cfg  install.log	 x	 模板	图片  下载  桌面
a1  a3	abc  df	     install.log.syslog  公共的  视频	文档  音乐
[root@6 ~]# ‘ls‘
a   a2	a4   anaconda-ks.cfg  install.log	 x	 模板	图片  下载  桌面
a1  a3	abc  df	     install.log.syslog  公共的  视频	文档  音乐
[root@6 ~]# "ls"
a   a2	a4   anaconda-ks.cfg  install.log	 x	 模板	图片  下载  桌面
a1  a3	abc  df	     install.log.syslog  公共的  视频	文档  音乐
[root@6 ~]# /bin/ls
a   a2	a4   anaconda-ks.cfg  install.log	 x	 模板	图片  下载  桌面
a1  a3	abc  df	     install.log.syslog  公共的  视频	文档  音乐

5、移动和重命名文件

    mv [OPTION]... [-T] SOURCE DEST

    mv [OPTION]... SOURCE... DIRECTORY

    mv [OPTION]... -t DIRECTORY SOURCE...

    常用选项: -i:  交互式

                      -f:  强制

[root@6 ~]# ls /testdir
1  2  3  4  a  b  c  lost+found  sysconfig  VMware Tools
[root@6 ~]# ls /test
[root@6 ~]# mv /testdir/{1..4}  /test
[root@6 ~]# ls /test
1  2  3  4
[root@6 ~]# touch a{1..3}
[root@6 ~]# ls
a1  a3               install.log         x       模板  图片  下载  桌面
a2  anaconda-ks.cfg  install.log.syslog  公共的  视频  文档  音乐
[root@6 ~]# mv -t /testdir/ a{1..3}
[root@6 ~]# ls
anaconda-ks.cfg  install.log.syslog  公共的  视频  文档  音乐
install.log      x                   模板    图片  下载  桌面
[root@6 ~]# ls /testdir
a1  a2  a3  lost+found  sysconfig  VMware Tools

6、删除

    1、rm [OPTION]... FILE...

       常用选项:

    -i:  交互式

    -f:  强制删除

    -r:  递归

    --no-preserve-root

      例: #rm -rf /

[root@6 ~]# \rm  -i a1
rm: 无法删除"a1": 没有那个文件或目录
[root@6 ~]# \rm  -i /testdir/a1
rm:是否删除普通空文件 "/testdir/a1"?y
[root@6 ~]# rm -f /testdir/a[2-3]
[root@6 ~]# ls /testdir/
lost+found  sysconfig  VMware Tools

7、目录操作

    1、 tree  显示目录树

    -d:  只显示目录

    -L level :指定显示的层级数目

    -P pattern:  只显示由指定pattern 匹配到的 路径

[root@6 ~]# mkdir -p b/c/d/
[root@6 ~]# tree b
b
└── c
   └── d
2 directories, 0 files
[root@6 ~]# tree -d b
b
└── c
   └── d
2 directories
[root@6 ~]# tree  -P c
.
├── b
│   └── c
│       └── d
├── \345\205\254\345\205\261\347\232\204
├── \346\250\241\346\235\277
├── \350\247\206\351\242\221
├── \345\233\276\347\211\207
├── \346\226\207\346\241\243
├── \344\270\213\350\275\275
├── \351\237\263\344\271\220
└── \346\241\214\351\235\242
11 directories, 0 files
[root@6 ~]# tree  -L 2
.
├── a
├── anaconda-ks.cfg
├── b
│   └── c
├── install.log
├── install.log.syslog
├── x -> ../dev/rtc
├── \345\205\254\345\205\261\347\232\204
├── \346\250\241\346\235\277
├── \350\247\206\351\242\221
├── \345\233\276\347\211\207
├── \346\226\207\346\241\243
├── \344\270\213\350\275\275
├── \351\237\263\344\271\220
└── \346\241\214\351\235\242
   ├── gnome-terminal.desktop
   └── ZI]7F[9~$4[}PW1O9YCMF}4.gif
10 directories, 7 files
[root@6 ~]# tree  -L 1
.
├── a
├── anaconda-ks.cfg
├── b
├── install.log
├── install.log.syslog
├── x -> ../dev/rtc
├── \345\205\254\345\205\261\347\232\204
├── \346\250\241\346\235\277
├── \350\247\206\351\242\221
├── \345\233\276\347\211\207
├── \346\226\207\346\241\243
├── \344\270\213\350\275\275
├── \351\237\263\344\271\220
└── \346\241\214\351\235\242
9 directories, 5 files

    2、mkdir  创建目录

    -p:  存在于不报错,且可自动创建所需的各目录;

    -v:  显示详细信息

    -m MODE:  创建目录时直接指定权限;

[root@6 ~]# mkdir -vp s/c/d/
mkdir: 已创建目录 "s"
mkdir: 已创建目录 "s/c"
mkdir: 已创建目录 "s/c/d/"
[root@6 ~]# tree s
s
└── c
   └── d
2 directories, 0 files

3、rmdir  删除空目录

-p:  递归删除父空目录

-v:  显示详细信息

[root@6 ~]# rmdir -pv  b/c/d/
rmdir: 正在删除目录 "/b/c/d/"
rmdir: 正在删除目录 "/b/c"
rmdir: 正在删除目录 "/b"

4、rm -r  递归删除目录树

[root@6 ~]# rm -vr b
rm:是否进入目录"b"? y
rm:是否进入目录"b/c"? y
rm:是否删除目录 "b/c/d"y
已删除目录:"b/c/d"
rm:是否删除目录 "b/c"?y
已删除目录:"b/c"
rm:是否删除目录 "b"?y
已删除目录:"b"

8、索引节点

    索引节点是一个磁盘分区或一个文件系统中存放文件的唯一编号,系统通过inode号就可以找到我们需要的文件。

    每个分区或文件系统都会各自维护一张inode表,因此不同分区或文件系统中会存在相同inode号的文件。

    1、 inode (index node )表中包含文件系统所有文件列表

    2、一个节点 (索引节点)是在一个表项,包含有关文件的信息

         ( 元数据  ),包括:

    *文件类型,权限,UID ,GID

    *链接数(指向这个文件名路径名称个数)

    *该文件的大小和不同的时间戳

    *指向磁盘上文件的数据块指针

    *有关文件的其他数据

    # for id in {1..204800};
    do touch f$id:
       echo f$id is created;
   done


      # df -i 查看inode号

      # ls -i  查看inode号

  8.1目录

    目录中存放的是文件inode号和名字的列表

    1、文件引用一个是 inode号

    2、系统是通过文件名来引用一个文件

    3、一个目录是目录下的文件名和文件inode 号之间的映射

  8.2  inode的大小及inode表

         inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。

         inode除了占用磁盘空间,inode号数量也是有限的。如果inode号占满后,系统也会报错。

[root@6 ~]# df -i
Filesystem      Inodes  IUsed   IFree IUse% Mounted on
/dev/sda2      3203072 107481 3095591    4% /
tmpfs           125517      4  125513    1% /dev/shm
/dev/sda1        51200     38   51162    1% /boot
/dev/sda3      1281120   4113 1277007    1% /testdir
/dev/sr0             0      0       0     - /media/CentOS_6.8_Final

   

8.3  inode 表存放信息及工作原理

    基本信息:属性信息,属主,文件大小,时间戳,指针(直接指针,双重指针,多重指针)

     以32位文件系统为例

         4KB   *1024  4MB   *1024  4TB

    元数据:inode table  

    数据内容: 数据块

    inode table  中包含一条条文件的记录信息,每条记录信息会包含该文件的元数据以及1-12的数据块直接指针,链接数据块。

    间接指针:1-12个数据数据块直接指针分别指向一个数据块,每个数据块中存放的是间接指针,指针指向数据块。

    双重间接指针:1-12个数据数据块直接指针分别指向一个数据块,每个数据块中存放的是间接指针,指向的数据块中依然存放的是双重间接指针,数据指针指向的是数据块。

8.4、cp 和inode     本质迁移数据,在数据区写入文件,并且会获得一个inode号,在inode表中和文件名关联并生成一个新条目。

    1、在 在 CP的命令:

    分配一个空闲的inode 号,在inode 表中生成新条目

    在目录中创建一个目录项,将名称与inode 编号关联

    拷贝数据生成新的文件

     rm 和inode     本质上数据区并不会删除数据,将该数据块标记为空。将inode表中该文件的条目删除,释放一个inode空间。

    1、rm  命令:

    链接数递减,从而释放的inode 号可以被重用

    把数据块放在空闲列表中6

    删除目录项

    数据实际上不会马上被删除,但当另一个文件使用数据块时将被覆盖。

    2、如果mv 命令的目标和源在相同的文件系统,作为mv 命令

    用新的文件名创建对应新的目录项

    删除旧目录条目对应的旧的文件名

    不影响inode表(除时间戳)或磁盘上的数据位置:没有数据被移动!

    3、如果目标和源在一个不同的文件系统,mv 相当于cp 和rm

    4、如果mv 命令的目标和源在相同的文件系统,作为mv  命令

    用新的文件名创建对应新的目录项

    删除旧目录条目对应的旧的文件名

    不影响inode表(除时间戳)或磁盘上的数据位置:没有数据被移动!

    5、如果目标和源在一个不同的文件系统,mv 相当于cp 和rm

9、链接文件

    链接文件有硬链接和符号链接两种,硬链接文件通俗的讲是源文件复制的重命名文件,软连接文件通俗的讲是指向源文件的指针文件。

 9.1硬链接

    1、创建硬链接会增加额外的记录项以引用文件

    2、 对应于同一文件系统上一个物理文件

    3、每个目录引用相同的 inode 号

    4、创建时链接数递增;目录下创建文件,目录的硬链接会增加

    5、删除文件时:

    rm 命令递减计数的链接

    文件要存在,至少有一个链接数

    当链接数为零时,该文件被删除

    6、不能跨越驱动器或分区,无法对目录创建硬链接

    7、语法 :

          ln filename [linkname ]

 9.2符号(或软)链接

    1、 一个符号链接指向另一个文件

    2、 ls - l的显示链接的名称和引用的文件

    3、 一个符号链接的内容是它引用文件的名称

    4、 可以对目录进行

    5、 可以跨分区

    6、 指向的是另一个文件的路径;其大小为指向的路径字符串的长度;不增加或减少目标文件inode 的引用计数;

    7、 语法:

    8、 ln -s  filename [linkname]  

        软连接文件

         原始文件的路径

          相对路径    相对于软链接文件的路径,而不是相对于当前工作目录  

 9.3 区别

            (1)与源文件的关系不同,硬链接原文件&链接文件公用一个inode号,说明他们是同一个文件,而软链接原文件&链接文件拥有不同的inode号,表明他们是两个不同的文件

            (2)文件属性不同的,软链接明确写出了是链接文件,而硬链接没有写出来,因为在本质上硬链接文件和原文件是完全平等关系;

            (3)链接数目是不同的,软链接的链接数目不会增加;

            (4)文件大小是不同的,硬链接文件显示的大小是跟原文件是一样的,这用强调,因为是等同的嘛,而这里软链接显示的大小与原文件就不同了,通常远小于源文件。

10.确定文件内容

    1、  文件可以包含多种类型的数据

    2、 检查文文件类型,然后确定适当的开放命令或应用程序使用

    3、 file [options] <filename>...

    Option:

[root@6 ~]# file a
a: empty

-b 列出文件辨识结果时,不显示文件名称。

[root@6 testdir]# file -b a
empty

-c详细显示指令执行过程,便于排错或分析程序执行形

[root@6 ~]# file -c a
cont	offset	type	opcode	mask	value	desc

-f 列出文件中文件名的文件类型

[root@6 testdir]# file -f a
/testdir/a.zip  :      cannot open `/testdir/a.zip  ‘ (No such file or directory)
/testdir/b  :          cannot open `/testdir/b  ‘ (No such file or directory)
/testdir/lost+found  : cannot open `/testdir/lost+found  ‘ (No such file or directory)
/testdir/sysconfig  :  cannot open `/testdir/sysconfig  ‘ (No such file or directory)
/testdir/VMware Tools: directory
:                      cannot open `‘ (No such file or directory)
[root@6 testdir]# cat a
/testdir/a.zip  
/testdir/b  
/testdir/lost+found  
/testdir/sysconfig  
/testdir/VMware Tools

-F 使用指定分隔符号替换输出文件名后默认的”:” 分隔符

[root@6 testdir]# file -F w a
aw ASCII text
[root@6 testdir]# file a
a: ASCII text

-i 输出mime 类型的字符串

[root@6 testdir]# file -i a
a: application/x-empty; charset=binary
[root@6 testdir]# file -i b
b: application/x-symlink; charset=binary
[root@6 testdir]# file -i a.zip
a.zip: text/plain; charset=us-ascii

-L 查看对应软链接对应文件的文件类型

[root@6 testdir]# ls
a  a.zip  b  lost+found  sysconfig  VMware Tools
[root@6 testdir]# file -L b
b: ASCII text

-z 尝试去解读压缩文件的内容

[root@6 testdir]# file -z a.zip
a.zip: ASCII text

--help 显示命令在线帮助

二、标准I/O和 和 管道

1、标准输入和输出

     程序:指令+ 数据

    读入数据:Input

    输出数据:Output

     打开的文件都有一个fd: file descriptor ( 文件描述符)

     Linux 给程序提供三种I/O 设备

    标准输入(STDIN )-0 默认接受来自键盘的输入

    标准输出(STDOUT )-1 默认输出到终端窗口

    标准错误(STDERR )-2 默认输出到终端窗口

    /O 重定向:改变默认位置

 

2、把输出和错误重新定向到文件

     STDOUT 和STDERR 可以被重定向到文件:

         命令 操作符号 文件名

            支持的操作符号包括:

    >  把STDOUT 重定向到文件

    2> 把STDERR 重定向到文件

    &> 把所有输出重定向到文件

[root@6 testdir]# ls . xxx > a 2> b
[root@6 testdir]# cat a
.:
a
a.zip
b
lost+found
sysconfig
VMware Tools
[root@6 testdir]# cat b
ls: 无法访问xxx: 没有那个文件或目录
[root@6 testdir]# ls . xxx &> c
[root@6 testdir]# cat c
ls: 无法访问xxx: 没有那个文件或目录
.:
a
a.zip
b
c
lost+found
sysconfig
VMware Tools



    >  文件内容会被覆盖

    # set -C:  禁止将内容覆盖 已有文件, 但可追加

    强制覆盖:>|

    # set +C:  允许覆盖

[root@6 testdir]# cat a
.:
a
a.zip
b
lost+found
sysconfig
VMware Tools
[root@6 testdir]# set +C
[root@6 testdir]# ls / > a
[root@6 testdir]# cat a
bin
boot
dev
etc
home
lib
lib64
lost+found
media
misc
mnt
net
opt
proc
root
sbin
selinux
srv
sys
test
testdir
tmp
usr
var
[root@6 testdir]# set -C
[root@6 testdir]# ls /dev > a
-bash: a: cannot overwrite existing file


>> 原有内容基础上,追加内容

[root@6 testdir]# cat b
ls: 无法访问xxx: 没有那个文件或目录
[root@6 testdir]# ls . >> b
[root@6 testdir]# cat b
ls: 无法访问xxx: 没有那个文件或目录
a
a.zip
b
c
lost+found
sysconfig
VMware Tools

#>f    生成f文件

[root@6 testdir]# >w
[root@6 testdir]# ls
a  a.zip  b  c  lost+found  sysconfig  VMware Tools  w


3、把输出和错误重新定向到文件

2>:  覆盖重定向错误输出数据流;

2>>:  追加重定向错误输出数据流;

标准输出和错误输出各自定向至不同位置:

COMMAND > /path/to/file.out 2> /path/to/error.out

合并标准输出和错误输出为同一个数据流进行重定向:

&> :覆盖重定向

&>> :追加重定向

COMMAND > /path/to/file.out 2> &1  (顺序很重要)

COMMAND >> /path/to/file.out 2>> &1

find /etc -name passwd 2> /dev/null

( ) :合并多个程序的STDOUT

    ( cal 2007 ; cal 2008 ) > all.txt

[root@6 testdir]# cat a
a
a.zip
lost+found
sysconfig
VMware Tools
w
bin
boot
dev
etc
home
lib
lib64
lost+found
media
misc
mnt
net
opt
proc
root
sbin
selinux
srv
sys
test
testdir
tmp
usr
var

练习

1 、将/etc/issue 文件中的内容转换为大写后保存至/tmp/issue.out 文件中

     # cat /etc/issue|tr ‘a-z‘ ‘A-Z‘ > /tmp/issue.out

[root@6 testdir]# cat /etc/issue|tr ‘a-z‘ ‘A-Z‘ > /tmp/issue.out
[root@6 testdir]# cat /tmp/issue.out
CENTOS RELEASE 6.8 (FINAL)
KERNEL \R ON AN \M

2 、将当前系统登录用户的信息转换为大写后保存至/tmp/who.out 文件中

  # who|tr ‘a-z‘ ‘A-Z‘ > /tmp/who.out

[root@6 testdir]# who
root     tty1         2016-07-29 08:37 (:0)
root     pts/0        2016-07-29 08:44 (:0.0)
root     pts/1        2016-07-29 08:44 (10.1.250.77)
[root@6 testdir]# who|tr ‘a-z‘ ‘A-Z‘ > /tmp/who.out
[root@6 testdir]# cat /tmp/who.out
ROOT     TTY1         2016-07-29 08:37 (:0)
ROOT     PTS/0        2016-07-29 08:44 (:0.0)
ROOT     PTS/1        2016-07-29 08:44 (10.1.250.77)

3 、一个linux 用户给root 发邮件,要求邮件标题为”help”,邮件正文如下:

Hello, I am  用户名,the system version is here,please help me to

check it ,thanks!操作系统版本信息

[lvasu@6 ~]$ echo -e "Hello, I am root,the system version is please help me to check it ,thanks! \n `cat /etc/centos-release`" | mail -s help root
[root@6 testdir]# mail
Heirloom Mail version 12.4 7/29/08.  Type ? for help.
"/var/spool/mail/root": 4 messages 4 new
>N  1 Anacron               Thu Jul 28 15:32  17/606   "Anacron job ‘cron.daily‘ on 6.local"
N  2 Anacron               Fri Jul 29 09:26  17/606   "Anacron job ‘cron.daily‘ on 6.local"
N  3 Anacron               Sun Jul 31 16:26  17/606   "Anacron job ‘cron.daily‘ on 6.local"
N  4 lvasu@6.localdomain   Sun Jul 31 22:22  19/641   "help"
Message  1:
From root@6.localdomain  Thu Jul 28 15:32:24 2016
Return-Path: <root@6.localdomain>
X-Original-To: root
Delivered-To: root@6.localdomain
From: Anacron <root@6.localdomain>
To: root@6.localdomain
Content-Type: text/plain; charset="ANSI_X3.4-1968"
Subject: Anacron job ‘cron.daily‘ on 6.localdomain
Date: Thu, 28 Jul 2016 15:32:23 +0800 (CST)
Status: R
/etc/cron.daily/mlocate.cron:
/usr/bin/updatedb: can not open `/etc/updatedb.conf‘: Permission denied

4 、将/root/下文件列表,显示成一行,并文件名之间用空格隔开。

ls /root |tr ‘\n‘ ‘\ ‘

[root@6 ~]# ls /root |tr ‘\n‘ ‘\ ‘
a anaconda-ks.cfg install.log install.log.syslog s x 公共的 模板 视频 图片 文档 下载 音乐 桌面

5 、file1 文件 的 内容为:”1 2 3 4 5 6 7 8 9 10” 计算出所有数字的总和

[root@6 testdir]# cat file1
1 2 3 4 5 6 7 8 9 10
[root@6 testdir]# cat file1 |tr ‘\ ‘ ‘+‘|bc
55

6 、删除Windows 文本文件中的‘^M‘ 字符

 cat a.txt|tr -d ‘^M‘
[root@6 桌面]#
y name is Bob.
I am from US.[root@6 桌面]# cat a.txt
My name is Bob.


7 、处理字符串“xt.,l 1 jr#!$mn 2 c*/fe 3 uz 4”,只保留其中的数字和空格

 # echo “xt.,l 1 jr#‘a-z‘mn2 c*/fe3 uz4”|tr -d ‘[:alpha:][:punct:]‘

  [root@6 ~]# echo “xt.,l 1 jr#‘a-z‘mn2 c*/fe3 uz4”|tr -d ‘[:alpha:][:punct:]‘
“ 1 2 3 4”

8、将PATH变量每个目录显示在独立的一行

[root@6 d]# pwd
/root/s/c/d
[root@6 d]# pwd |tr ‘/‘ ‘\n‘
root
s
c
d

9、删除指定文件的空行

[root@6 testdir]# cat w
ab

cd

ef

gh
[root@6 testdir]# cat w |tr -s "\n"
ab
cd
ef
gh




10、将文件中每个单词(字母)显示在独立的一行,并无空行

[root@6 testdir]# cat w
My name is Bob.I am from US.
[root@6 testdir]# cat w| tr "[:space:]" "\n"|tr "[:punct:]" "\n"
My
name
is
Bob
I
am
from
US

class-4 Linux文件系统(二)及IO重定向

标签:linux基础

原文地址:http://lvpuchao.blog.51cto.com/11319327/1832922

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!