Linux初体验(五)


  • 文件通配符

  • 绝对路径与相对路径

  • 发邮件

  • file

  • tree


文件通配符

用途说明

文件通配符是一种简洁高效的语句,主要用来精确搜索或模糊搜索文件。其用一个或多个特殊的字符来实现对真正字符的替换,从而完成相关的任务。

在Linux中,主要有以下文件通配符:

*  匹配零个或多个字符
?  匹配任意单个字符
~  当前用户家目录
~username  用户家目录 

[0-9]  匹配一个数字范围
[a-z]  大写与小写字母
[A-Z]  大写字母
[ ]  匹配列表中的任意一个字符
[^ ]  对列表中的字符取反

预定义字符类:
[:digit:]  任意数字,相当于 0-9 
[:lower:]  任意小写字母
[:upper:]  任意大写字母
[:alpha:]  任意大小写字母
[:alnum:]  任意数字或字母
[:space:]  空格
[:punct:]  标点符号

使用示例

练习环境为CentOS 6.8

1、显示/var目录下所有以l开头,以一个小写字母结尾,且中间出现至少一位数字的文件或目录
2、显示/etc目录下以任意一位数字开头,且以非数字结尾的文件或目录
3、显示/etc/目录下以非字母开头,后面跟了一个字母及其它任意长度任意字符的文件或目录
4、显示/etc目录下所有以m开头以非数字结尾的文件或目录
5、显示/etc目录下,所有以.d结尾的文件或目录
6、显示/etc目录下,所有.conf结尾,且以m,n,r,p开头的文件或目录
[root@centos6 var]# ls -d l*[0-9]*[[:lower:]]
l4e
[root@centos6 var]# 
[root@centos6 etc]# ls -d [^[:alpha:]]*[^0-9]
33a
[root@centos6 etc]# 
[root@centos6 etc]# ls -d [[:digit:]]*[0-9]
5ea23
[root@centos6 etc]# 
[root@centos6 etc]# ls -d m*[^0-9]
magic    mail.rc    man.config  mime.types   modprobe.d  mtab         my.cnfmailcap 
 makedev.d  maven       mke2fs.conf  motd        mtools.conf[root@centos6 etc]# 
# 注:这个方法无法显示出文件名为 m 的情况
[root@centos6 etc]# ls -d [mnrp]*.conf
mke2fs.conf    ntp.conf                      prelink.conf      resolv.confmtools.conf    
pbm2ppa.conf                  readahead.conf    rsyslog.confnfsmount.conf  
pm-utils-hd-apm-restore.conf  reader.confnsswitch.conf  pnm2ppa.conf                  
request-key.conf[root@centos6 etc]#

绝对路径与相对路径

在Linux中,绝对路径是以 / (根目录) 开始的,换言之,如果一个路径是以 / 开始的,那么它一定就是绝对路径;其有如下特点:

- 以正斜杠开始
- 完整的文件路径
- 可用于任何可指定一个文件名的时候

相对路径是以 .  .. 开始的,其中,. 表示用户当前操作所处的位置, 而 .. 表示上级目录;其有如下特点:

- 不以斜线开始
- 指定相对于当前工作目录或某目录的位置
- 可以作为一个简短的形式指定一个文件名

使用示例

[root@centos6 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
HWADDR=00:0C:29:89:BC:21
TYPE=Ethernet
UUID=76d50032-414a-4512-9f19-7d93af6bc0c4
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=dhcp
[root@centos6 ~]# 
[root@centos6 ~]# cd /usr/local
[root@centos6 local]# cd ..
[root@centos6 usr]# cd local/
[root@centos6 local]# cd ../..
[root@centos6 /]#

发个简单邮件

用途说明

mail命令是电子邮件的发送与接收工具,本次发送邮件我们仅使用 -s 这一个参数,[-s subject] ,即主题。场景:在CentOS 6.8上面用 root 用户给普通用户 liansir 发个简单邮件。

  1. 直接发送

[root@centos6 ~]# mail -s "Hello lian sir" liansir   # 给liansir发送邮件
Hi,I'm root                  
I want you
.
EOT
[root@centos6 ~]# 

输入第一行命令后回车,即可编写邮件正文,输入 . 表示结束,再次回车便退出编辑;
或者直接按 Ctrl+d 结束编辑,完成邮件的发送。

[liansir@centos6 ~]$ mail           # liansir接收邮件
Heirloom Mail version 12.4 7/29/08.  Type ? for help."/var/spool/mail/liansir": 1 message 1 new
>N  1 root                  Thu Jul 28 20:47  19/598   "Hello lian sir"& 
Message  1:
From root@centos6.liansir  Thu Jul 28 20:47:35 2016Return-Path: <root@centos6.liansir>
X-Original-To: liansir
Delivered-To: liansir@centos6.liansir
Date: Thu, 28 Jul 2016 20:47:35 +0800
To: liansir@centos6.liansir
Subject: Hello lian sir
User-Agent: Heirloom mailx 12.4 7/29/08
Content-Type: text/plain; charset=us-ascii
From: root@centos6.liansir (root)
Status: RHi,I'm root
I want you

& qHeld 1 message in /var/spool/mail/liansir
You have mail in /var/spool/mail/liansir
[liansir@centos6 ~]$
  1. 使用管道进行邮件发送

[root@centos6 ~]# echo "Hi,I'm root,I want you" |mail -s "haha" liansir
[root@centos6 ~]#

echo 的是邮件的正文,管道后面输入 mail 命令即可完成邮件的发送,另外,在echo 正文结束时,不要使用! 结尾,否则会报错。另外,单引号也不太好使。

[root@centos6 ~]# echo "Hi,I'm root,I want you!" |mail -s "haha" liansir
-bash: !": event not found
[root@centos6 ~]# 可如此解决:
[root@centos6 ~]# echo "Hi,I'm $(whoami),I want you"'!' | mail -s "haha" liansir
[root@centos6 ~]#
  1. 使用输入重定向发送邮件

此种方式可提前写好邮件正文,然后直接使用输入重定向的方式发送文件。

[root@centos6 ~]# mail -s "laiba" liansir < sir.mail 
[root@centos6 ~]#

[liansir@centos6 ~]$ mail
Message 16:
From root@centos6.liansir  Thu Jul 28 22:26:52 2016Return-Path: <root@centos6.liansir>
X-Original-To: liansir
Delivered-To: liansir@centos6.liansir
Date: Thu, 28 Jul 2016 22:26:52 +0800To: liansir@centos6.liansir
Subject: laiba
User-Agent: Heirloom mailx 12.4 7/29/08Content-Type: text/plain; charset=us-ascii
From: root@centos6.liansir (root)
Status: R

xixi,
we will be friends!

& 
At EOF
& q
Held 16 messages in /var/spool/mail/liansir
[liansir@centos6 ~]$

file

用途说明

判断文件类型

file - determine file type, file命令用来检查文件的类型。

常用参数

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

  2. -c: 详细显示指令执行过程

  3. -f: 列出文件中文件名的文件类型

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

  5. -i: 输出mime类型的字符串

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

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

  8. --help: 显示命令在线帮助

  9. -v: 显示版本信息

使用示例

1、显示文件类型

[root@centos6 ~]# file /etc/issue
/etc/issue: ASCII text
[root@centos6 ~]# file -b /etc/issue              # 不显示文件名称 
ASCII text
[root@centos6 ~]# file install.log
install.log: ASCII text
[root@centos6 ~]# file -i install.log
install.log: text/plain; charset=us-ascii         # 显示MIME类别     
[root@centos6 ~]#

2、显示符号链接的文件类型

[root@centos6 ~]# ls -l /usr/tmp
lrwxrwxrwx. 1 root root 10 Jul 20 16:56 /usr/tmp -> ../var/tmp
[root@centos6 ~]# ls -l /var/mail
lrwxrwxrwx. 1 root root 10 Jul 20 16:56 /var/mail -> spool/mail
[root@centos6 ~]#
[root@centos6 ~]# file /usr/tmp
/usr/tmp: symbolic link to `../var/tmp'
[root@centos6 ~]# file /var/mail
/var/mail: symbolic link to `spool/mail'
[root@centos6 ~]#
[root@centos6 ~]# file -Lb /usr/tmp
sticky directory                        # 显示出/var/tmp的文件类型
[root@centos6 ~]# file -Lb /var/mail
directory                               # 显示出/var/spool/mail的文件类型
[root@centos6 ~]# 
[root@centos6 ~]# file /etc/passwd
/etc/passwd: ASCII text
[root@centos6 ~]# file -F"#" /etc/passwd
/etc/passwd# ASCII text                 # 所显示文件名后的字符串:变成了#
[root@centos6 ~]# file -v 
file-5.04magic file from /etc/magic:/usr/share/misc/magic
[root@centos6 ~]#

3、批量判断文件类型

[root@centos6 ~]# file -f filetype
/etc/issue: ASCII text
/dev/null:  character special
/dev/zero:  character special
/testdir:   directory
[root@centos6 ~]# cat filetype
/etc/issue
/dev/null/dev/zero
/testdir
[root@centos6 ~]#


tree

用途说明

以树状图列出目录的结构

tree - list contents of directories in a tree-like format.

常用参数

  1. -d: 只显示目录

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

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

  4. -l: 如遇到符号链接目录则列出其指向的原始目录

  5. -p: 列出权限标识

  6. -s: 列出文件和目录大小

  7. -t: 用文件和目录的更改时间排序

  8. -u: 列出文件和目录的属主,无对应名称时则显示用户识别码

由于涉及到了目录操作,此处再介绍几个常见的目录操作命令:

mkdir: 创建目录
    -p: 自动创建所需的各目录,且如果有目录存在也不报错    
    -v: 显示详细信息    
    -m MODE: 创建目录时直接指定权限   
     
rmdir:删除空目录
    -p: 递归删除父空目录 
    -v: 显示详细信息  
      
rm -r:递归删除目录树

注意:在创建文件时,一般情况下要确保新建的目录与其所在目录下的文件没有重名;另外,在创建文件时,可通过创建子目录的方式更加高效地组织文件,采取统一的命名规则,如目录名可大写字母开头,如此,在目录列出中目录名就出现在最前面。

使用示例

1、在/usr/games/目录下创建LOL子目录,且只有root用户才能读写执行,其他用户无权访问

[root@centos6 ~]# mkdir -m 700 /usr/games/LOL
[root@centos6 ~]# tree /usr/games/
/usr/games/
└── LOL1 directory, 0 files
[root@centos6 ~]# 
[root@centos6 ~]# cd /usr/games/
[root@centos6 games]# ls -l
total 4drwx------. 2 root root 4096 Jul 29 09:53 LOL
[root@centos6 games]#
  1. 创建如下目录结构

    /tmp/newroot
    	├── bin
    	├── etc
    	│   └── sysconfig
    	│       └── network-scripts
    	├── sbin
    	├── usr
    	│   ├── bin
    	│   ├── lib
    	│   ├── lib64
    	│   ├── local
    	│   │   ├── bin
    	│   │   ├── etc
    	│   │   ├── lib
    	│   │   └── sbin
    	│   └── sbin
    	└── var
    	    ├── cache
    	    ├── log
    	    └── run
[root@centos6 ~]# mkdir -p /tmp/newroot/{bin,etc/sysconfig/network-scripts,sbin,
usr/{bin,sbin,lib64,local/{bin,etc,lib,sbin},sbin},var/{log,bin,run}}  

[root@centos6 ~]# tree /tmp/newroot/
/tmp/newroot/
├── bin
├── etc
│   └── sysconfig
│       └── network-scripts
├── sbin
├── usr
│   ├── bin
│   ├── lib64
│   ├── local
│   │   ├── bin
│   │   ├── etc
│   │   ├── lib
│   │   └── sbin
│   └── sbin
└── var
    ├── bin
    ├── log
    └── run

18 directories, 0 files
[root@centos6 ~]#

3、显示/usr/local下的一级目录的大小、权限,并以更改时间排序

[root@centos6 ~]# tree -L 1 -stp /usr/local
/usr/local
├── [drwxr-xr-x        4096]  bin
├── [drwxr-xr-x        4096]  sbin
├── [drwxr-xr-x        4096]  share
├── [drwxr-xr-x        4096]  etc
├── [drwxr-xr-x        4096]  games
├── [drwxr-xr-x        4096]  include
├── [drwxr-xr-x        4096]  lib
├── [drwxr-xr-x        4096]  lib64
├── [drwxr-xr-x        4096]  libexec
└── [drwxr-xr-x        4096]  src10 directories, 0 files
[root@centos6 ~]#

2016.7.29

止战