通配符与特殊符号

第1章        find 按照时间查找

1.1   时间查找

     -mtime

     -ctime

     -atime

  语法格式:  经常用来处理日志(日志不重要 或者只保留7天的日志)

    find /oldboy -type f -mtime +n(n是数字 代表天的意思)

                                  +7 7天前被修改过的文件

                                   -7 7天内被修改过的文件

                               

               -mtime 1   文件的修改时间为距离当前时间1天           24-48小时的文件

               -mtime 0   文件的修改时间为距离当前时间不到1天       24小时之内的文件

               -mtime +1  文件的修改时间为距离当前时间2天           48小时以前的文件

               -mtime -1  文件的修改时间为距离当前时间小于1天的文件 24小时内的文件

 

[root@oldboyedu-lnb ~]# touch 1day.txt
[root@oldboyedu-lnb ~]# ll
total 0
-rw-r--r-- 1 root root  0 Aug  5 09:16 1day.txt
-rw-r--r-- 1 root root  0 Jul 25 00:00 oldboy.txt
drwxr-xr-x 2 root root 36 Aug  4 11:50 test
-rw-r--r-- 1 root root  0 Jul 25 00:00 test.txt
[root@oldboyedu-lnb ~]# find ./ -type f -mtime +7
./test.txt
./oldboy.txt
[root@oldboyedu-lnb ~]# find ./ -type f -mtime -7
./1day.txt
[root@oldboyedu-lnb ~]# find ./ -type f -mtime 0
./1day.txt
[root@oldboyedu-lnb ~]# find ./ -type f -mtime -1
./1day.txt

       常见面试题: 查找/var/log/data/下修改时间为7天前文件并删除

find ./ -type f -mtime +7|xargs  rm
find ./ -type f -mtime +7|xargs -i cp {} /tmp

1.2   !在find中取反   ===  -no

[root@oldboyedu-lnb test]# find ./ ! -type f    # 查找文件 取反后查找 除文件外所有类型
find查找inode删除
[root@oldboyedu-lnb ~]# rm -f `find ./ -inum 33575024`    

第2章      通配符

2.1  shell的内置功能

         查找文件名 而不是查看过滤文件内容

          Linux的命令都支持通配符

        $()和“ 相同

       .. #当前目录的上一级目录

       ! #find awk 中表示取反linux 命令行表示历史记录?  #任意一个字符,通配符

       # #表示注释

       | #管道,或者(正则)

      $ #以..结尾(正则),$LANG $取变量内容

      ^ #..开头(正则)

     ~ #当前用户的家目录

      “(反引号) $() #引用命令的结果

     && 并且 同时成立

      [] #表示一个范围,集合 [abcdefg] [a-g] (正则,通配符) {} #产生一个序列,(通配符)

     命令1|命令2 ###管道符号 传递的是普通的字符串,文本 来自于前一个命令

      |xargs ###管道符号 与xargs 传递的是把字符串变成了 文件名

     . #当前目录,任意一个字符(正则)

     .. #当前目录的上一级目录

      * #任意0 个或多个字符(文本)(通配符)

      > #输出重定向 会清空原来的内容 然后在向文件里面追加内容

      >> #追加输出重定向 追加到文件的最后一行

    < #输入重定向 tr xargs

    << #cat 用来给文件追加多行文本

   # #注释 linux 会忽视他。给人看的。解释说明。

    # root 超级用户的 提示符

   $ shell

  $变量 ====>取变量里面的内容 

手 鞋盒子 拿出鞋 ====>取变量里面的内容awk  $取列 $数字

    /etc /bin /usr/local

   cd / && tar zcf /tmp/and.tar.gz etc bin usr/local

   ifdown eth0 && ifup eth0

   “(反引号) 引用命令的结果 ls -l `which cat ` ——$()

   ; 分号,分隔多个命令 pwd;pwd;pwd ;hostname ;

  – cd – ; su –

  ” 双引号

  ~ 当前用户的家目录 老家

  ^ 正则表达式

   / 根 路径分隔符

  \ 转义符号 \班长 ===> 学生

  ? 通配符 正则表达式

  + 正则表达式

  2.1.1   取反(find awk) find 在linux 中bash 命令行使用

          find /oldboy /etc  ! -name  “oldboy.txt”

                 awk ‘!/oldboy/’ filename

      2.1.2  表示强制

           vi/vim

                vi 强制退出  !+字母 调取最近以此字母开头的命令

     2.1.3  历史命令

              * 代表任意字符(0 个或多个)

             ls *.txt

             find -name “*.log”

            [abcd] 匹配 abcd 中任何一个字符

            表示范围 a 到 z,-表示范围的意思

            [a-z]  [] 匹配中括号中任意一个字符  ls file0[678] ls file0[0-9]

            {…}  表示生成序列。以逗号分隔,且不能有空格

           [!abcd] 或[^abcd] 表示非,表示不匹配括号里面的任何一个字符

2.2   环境准备

mkdir /oldboy/20200118
cd /oldboy/20200118
touch stu{00..10}.txt oldboy{00..10}.log
ll
touch oldboy.txt stu.txt
*表示任何字符串/文本(0或多个)

  2.2.1   找出以stu开头的文件

[root@oldboyedu-lnb 20200118]# ll stu*
-rw-r--r-- 1 root root 0 Aug  5 10:04 stu00.txt

  2.2.2   找出以stu开头并且以.txt结尾的文件

[root@oldboyedu-lnb 20200118]# touch stu{1..5}.log
[root@oldboyedu-lnb 20200118]# ll stu*.txt
-rw-r--r-- 1 root root 0 Aug  5 10:04 stu00.txt

  2.2.3    查找所有以.txt 结尾的文件

[root@oldboyedu-lnb 20200118]# ll *.txt
-rw-r--r-- 1 root root 0 Aug  5 10:04 oldboy.txt
-rw-r--r-- 1 root root 0 Aug  5 10:04 stu00.txt
[root@oldboyedu-lnb 20200118]# ll *txt
-rw-r--r-- 1 root root 0 Aug  5 10:04 oldboy.txt

  2.2.4    使用find查找.txt结尾的文件

[root@oldboyedu-lnb 20200118]# find ./ -type f -name "*.txt"
./stu00.txt
./stu01.txt
[root@oldboyedu-lnb 20200118]# find -name "*.txt"
./stu00.txt
./stu01.txt

  2.2.5
   使用find查找以stu开头的文件、查找以stu开头并且以.log 结尾的文件

[root@oldboyedu-lnb 20200118]# find -name "stu*"
./stu00.txt
./stu01.txt
[root@oldboyedu-lnb 20200118]# find -name "stu*.log"
./stu1.log
./stu2.log

  2.2.6    找出当前目录下面  文件名中包含(只要有就行)oldboy的文件 —模糊

[root@oldboyedu-lnb 20200118]# ll *oldboy*
-rw-r--r-- 1 root root 0 Aug  5 10:16 awk-oldboy
-rw-r--r-- 1 root root 0 Aug  5 10:16 lidao-oldboy.txt
-rw-r--r-- 1 root root 0 Aug  5 10:04 oldboy00.log
[root@oldboyedu-lnb 20200118]# find -name "*oldboy*"
./oldboy10.log
./oldboy.txt
./awk-oldboy
./lidao-oldboy.txt

2.3   ?任何一个字符/文本/字母

  2.3.1  .匹配st后任意单个字符并以.txt结尾的文件

[root@oldboyedu-lnb 20200118]# ll st?.txt
-rw-r--r-- 1 root root 0 Aug  5 10:04 stu.txt
[root@oldboyedu-lnb 20200118]# ll st??.log
-rw-r--r-- 1 root root 0 Aug  5 10:07 stu1.log
-rw-r--r-- 1 root root 0 Aug  5 10:07 stu2.log

  2.3.2  查找单个字符的命令

[root@oldboyedu-lnb 20200118]# ll /bin/?
-rwxr-xr-x. 1 root root 41480 Apr 11  2018 /bin/[
-rwxr-xr-x. 1 root root 19904 Apr 11  2018 /bin/w
[root@oldboyedu-lnb 20200118]# ll /bin/???

2.4  wc 命令     # 重要 常用

wc命令用来计算数字, 利用wc指令我们可以计算文件的Byte数,字数或是列数,若不指定文件名称,或是所给予的文件名为”-”,则wc指令会从标准输入设备读取数据.

wc 语法

wc(选项)(参数)

选项:

-c或–bytes或——chars只显示Bytes数

-l或——lines只显示列数

w或——words只显示字数

[root@oldboyedu-lnb 20200118]# cat 1.txt
12345678
123
12345
[root@oldboyedu-lnb 20200118]# cat 1.txt|wc –L(统计总共数目)
8
[root@oldboyedu-lnb 20200118]# cat 1.txt|wc -l
3

2.5   [abcd] 表示一个整体一个筐,这个筐里面有4个情况 表示

       查找文件名称包含a的 或者包含b的 或者包含c的….

       查找当前目录下所有包含1234的文件

  

[root@oldboyedu-lnb 20200118]# ll stu[1234].log
-rw-r--r-- 1 root root 0 Aug  5 10:07 stu1.log
-rw-r--r-- 1 root root 0 Aug  5 10:07 stu2.log
-rw-r--r-- 1 root root 0 Aug  5 10:07 stu3.log
-rw-r--r-- 1 root root 0 Aug  5 10:07 stu4.log
[root@oldboyedu-lnb 20200118]# ll stu[1-4].log
-rw-r--r-- 1 root root 0 Aug  5 10:07 stu1.log
-rw-r--r-- 1 root root 0 Aug  5 10:07 stu2.log
[root@oldboyedu-lnb 20200118]# ll stu?[0123456789].txt
-rw-r--r-- 1 root root 0 Aug  5 10:04 stu00.txt
-rw-r--r-- 1 root root 0 Aug  5 10:04 stu01.txt
[root@oldboyedu-lnb 20200118]# ll stu[01][0123456789].txt
-rw-r--r-- 1 root root 0 Aug  5 10:04 stu00.txt
-rw-r--r-- 1 root root 0 Aug  5 10:04 stu01.txt
[root@oldboyedu-lnb 20200118]# ls stu0[0-3]
ls: cannot access stu0[0-3]: No such file or directory
[root@oldboyedu-lnb 20200118]# ls stu0[0-3]*
stu00.txt  stu01.txt  stu02.txt  stu03.txt
[root@oldboyedu-lnb 20200118]# ll stu0[0-3]*
-rw-r--r-- 1 root root 0 Aug  5 10:04 stu00.txt
-rw-r--r-- 1 root root 0 Aug  5 10:04 stu01.txt
-rw-r--r-- 1 root root 0 Aug  5 10:04 stu02.txt
-rw-r--r-- 1 root root 0 Aug  5 10:04 stu03.txt

2.6  找出文件以s或o开头。

[root@oldboyedu-lnb 20200118]# ll s*
-rw-r--r-- 1 root root 0 Aug  5 10:04 stu00.txt
[root@oldboyedu-lnb 20200118]# ll o*
-rw-r--r-- 1 root root 0 Aug  5 10:04 oldboy00.log

2.7  {}生成序列(一连串的文本)#cp A{B,C}                                                      

[root@oldboy local]# echo {0..9} 
复制所有的.tar.gz 和.txt 结尾的文件到家目录下
[root@oldboyedu-lnb 20200118]# echo {*.tar.gz,*.txt}
all.tar.gz 1.txt lidao-oldboy.txt oldboy.txt stu00.txt stu01.txt stu02.txt stu03.txt 
stu04.txt stu05.txt stu06.txt stu07.txt stu08.txt stu09.txt stu10.txt stu.txt [root@oldboyedu-lnb 20200118]# ll ~ total 0 drwxr-xr-x 2 root root 6 Aug 5 10:48 alex drwxr-xr-x 2 root root 54 Aug 5 10:49 test [root@oldboyedu-lnb 20200118]# cp {*.tar.gz,*.txt} ~ [root@oldboyedu-lnb 20200118]# #输出stu01..10 oldboy01..10 alex01..10 [root@oldboyedu-lnb 20200118]# echo {stu,oldboy,alex}{01..10} stu01 stu02 stu03 stu04 stu05 stu06 stu07 stu08 stu09 stu10 oldboy01 oldboy02 oldboy03 oldboy04 oldboy05 oldboy06 oldboy07 oldboy08 oldboy09
oldboy10 alex01 alex02 alex03 alex04 alex05 alex06 alex07 alex08 alex09 alex10

2.8  [!abcd] ! ^表示非

[root@oldboyedu-lnb 20200118]# ll stu0[!0-8].txt
-rw-r--r-- 1 root root 0 Aug  5 10:04 stu09.txt
[root@oldboyedu-lnb 20200118]# ll stu[1-5].txt
ls: cannot access stu[1-5].txt: No such file or directory
[root@oldboyedu-lnb 20200118]# ll stu[1-5].log
-rw-r--r-- 1 root root 0 Aug  5 10:07 stu1.log
-rw-r--r-- 1 root root 0 Aug  5 10:07 stu2.log
-rw-r--r-- 1 root root 0 Aug  5 10:07 stu3.log
-rw-r--r-- 1 root root 0 Aug  5 10:07 stu4.log
-rw-r--r-- 1 root root 0 Aug  5 10:07 stu5.log
[root@oldboyedu-lnb 20200118]# ll stu[!1-5].log
ls: cannot access stu[!1-5].log: No such file or directory
[root@oldboyedu-lnb 20200118]# ll stu[!1-4].log
-rw-r--r-- 1 root root 0 Aug  5 10:07 stu5.log

  2.8.1    对中扩号内的包含s或t或u的进行取反

[root@oldboyedu-lnb 20200118]# ll [!stu]*.txt
-rw-r--r-- 1 root root 19 Aug  5 10:27 1.txt
-rw-r--r-- 1 root root  0 Aug  5 10:16 lidao-oldboy.tx
-rw-r--r-- 1 root root  0 Aug  5 10:16 oldboy.txt
[root@oldboyedu-lnb 20200118]# touch s.txt tttt.txt
[root@oldboyedu-lnb 20200118]# ll [!stu]*.txt
-rw-r--r-- 1 root root 19 Aug  5 10:27 1.txt
 -rw-r--r-- 1 root root  0 Aug  5 10:16 lidao-oldboy.txt
-rw-r--r-- 1 root root  0 Aug  5 10:16 oldboy.txt
[root@oldboyedu-lnb 20200118]# ll stu0[^0-8].txt
-rw-r--r-- 1 root root 0 Aug  5 10:04 stu09.txt     

  2.8.2    [^^] 第一个代表取反 第二个普通字符

[root@oldboyedu-lnb 20200118]# ll stu0[^0-8].txt
-rw-r--r-- 1 root root 0 Aug  5 10:04 stu09.txt
-rw-r--r-- 1 root root 0 Aug  5 11:05 stu0^.txt
[root@oldboyedu-lnb 20200118]# ll stu0[^^0-8].txt
-rw-r--r-- 1 root root 0 Aug  5 10:04 stu09.txt

2.9  []和{}的区别

          常用的:

          ()小括号 正则中表示一个整体

          []中括号

          {}大括号(花括号)

        a) 都可以查看文件名

        b) {}可以生产序列

        c) [] 不能生产序列

使用{}序列的方式查看文件名   {} 是..表示区间序列 [] 是 – 表示区间序列

    [root@oldboyedu-lnb 20200118]# ll stu0{0..9}*

    -rw-r--r-- 1 root root 0 Aug  5 10:04 stu00.txt

    -rw-r--r-- 1 root root 0 Aug  5 10:04 stu01.txt

    -rw-r--r-- 1 root root 0 Aug  5 10:04 stu02.txt

    [root@oldboyedu-lnb 20200118]# ll stu0[0-9]*

    -rw-r--r-- 1 root root 0 Aug  5 10:04 stu00.txt

    -rw-r--r-- 1 root root 0 Aug  5 10:04 stu01.txt

           .   当前的目录

           ..  上一级目录

        .file 隐藏文件  点和文件中间没有空格

        > === 1>   接收正确的输出结果 到空 到文本中

       >> ===2 >> 追加

             2>   错误的输出结果 先清空

            2>>  错误的输出结果 追加

           <    tr

         <<   cat

       把结果定向到空

         >1.txt 2>&1

         >1.txt 2>1.txt

        &>1.txt

 

   [root@oldboyedu-lnb 20200118]# cat >>oldboy.txt<<EOF

    > oldboy

    > oldgirl

    > EOF

    [root@oldboyedu-lnb 20200118]# cat oldboy.txt

    oldboy

    oldgirl

2.10  $ 调用变量  大部分命令都可以直接调用变量 而不需要先echo(mkdir  /$dir)

    

[root@oldboyedu-lnb 20200118]# echo $PS1
[\u@\h \W]\$
[root@oldboyedu-lnb 20200118]# echo $LANG
en_US.UTF-8
[root@oldboyedu-lnb 20200118]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@oldboyedu-lnb 20200118]# echo test
 test
[root@oldboyedu-lnb 20200118]# dir=test
[root@oldboyedu-lnb 20200118]# touch $dir
[root@oldboyedu-lnb 20200118]# ll test
 -rw-r--r-- 1 root root 0 Aug  5 11:37 test

第3章       特殊符号的应用

 

通配符

含义

*

代表任意(0个或多个)字符。ls file*

?

代表任意1个字符。ls file0?

[abcd]

匹配中括号中任意一个字符。ls file0[678] ls file0[0-9]

[root@oldboyedu ~]# ls file0[^67]   ==>^尖角号  非,取反

file08  file09

{}

中间为命令区块组合或内容生成序列

[root@oldboyedu local]# echo {0..9}

0 1 2 3 4 5 6 7 8 9

[root@oldboyedu local]# echo {0,9}

0 9

[root@oldboyedu local]# echo {1,2,3}

1 2 3

[root@oldboyedu local]# echo {a..z}

a b c d e f g h i j k l m n o p q r s t u v w x y z

特殊符号

含义

; 分号

连续不同命令的分隔符

[root@oldboyedu tmp]# cd /;mkdir test

[root@oldboyedu /]# ll -h test

总用量 0

#

配置文件注释

|

管道, 将前一个命令的结果交给后一命令继续处理

[root@oldboyedu ~]# cat test.txt |xargs -n 3

1 2 3

4 5 6

7 8 9

10 11

~

cd ~ 当前用户的家目录

cd – 用户上一次所在的目录,由变量OLDPWD控制

[root@oldboyedu data]# env|grep -i old

OLDPWD=/root

su – 切换用户的系统环境

..

上一级目录

.

当前目录

当前目录的三种写法

#不加路径===当前路径

[root@oldboyedu data]# ls

dir2  dir3  ett.txt  file3.txt  file5.txt  hello.txt  oldboy.txt 

#

[root@oldboyedu data]# ls .

dir2  dir3  ett.txt  file3.txt  file5.txt  hello.txt  oldboy.txt 

[root@oldboyedu data]# ls ./

dir2  dir3  ett.txt  file3.txt  file5.txt  hello.txt  oldboy.txt 

[root@oldboyedu data]#

$

①变量前需要加的符号  $OLDPWD

②普通用户的命令提示符  [oldboy@oldboyedu ~]$

/

①根

②路径分隔符号. windows是反斜线 “\”

\

①屏蔽系统别名

②转义 echo “$OLDPWD ”  echo “\$OLDPWD “

[root@oldboyedu tmp]# echo “$OLDPWD “

/root

[root@oldboyedu tmp]# echo “\$OLDPWD “

$OLDPWD

>

输出重定向

>>

追加输出重定向

输入重定向

<< 

追加输入重定向

‘ ‘

单引号,不具有变量置换功能,输出时所见即所得

” “

双引号,具有变量置换功能,解析变量输出

` `

倒引号,“中间是命令,会先执行,等价$()

!

①逻辑运算中的“非”(not)

②vi/vim 强制退出

③!+字母 调出最近一次以此字母开头的命令

!!  使用最近一次操作的命令

!+数字 调出历史的第几条命令

&&

当前一个指令执行成功时,执行后一个指令

[root@oldboyedu tmp]# tou test1&& touch test2

-bash: tou: command not found

[root@oldboyedu tmp]# ls

data  oldboy  passwd  services.log

[root@oldboyedu tmp]# tou test1;touch test2  

-bash: tou: command not found

[root@oldboyedu tmp]# ls

data  oldboy  passwd  services.log  test2

||

当前一个指令执行失败时,执行后一个指令

[root@oldboyedu tmp]# tou test1||touch test3  

-bash: tou: command not found

[root@oldboyedu tmp]# ls

data  oldboy  passwd  services.log  test2  test3

 

‘ ‘ 单引号所见即所得
不会解析变量的内容

“”
双引号和不加引号 都会解析变量的内容

“ 反引号引用命令的结果 $() 里面必须是可执行命令

;  分号分隔多个命令,没有逻辑联系 只是一步一步执行  find中的分号是结尾的意思 \;     

[root@oldboyedu-lnb 20200118]# ll `which cat`
-rwxr-xr-x. 1 root root 54080 Apr 11  2018 /usr/sbin/cat
[root@oldboyedu-lnb 20200118]# ll $(which cat)
-rwxr-xr-x. 1 root root 54080 Apr 11  2018 /usr/sbin/cat
[root@oldboyedu-lnb 20200118]# time=`date +%F`
[root@oldboyedu-lnb 20200118]#
[root@oldboyedu-lnb 20200118]# echo $time
2020-08-05
[root@oldboyedu-lnb 20200118]#
[root@oldboyedu-lnb 20200118]# test="$time-alex"
[root@oldboyedu-lnb 20200118]# echo $test
 2020-08-05-alex
[root@oldboyedu-lnb 20200118]# test='$time-alex'
[root@oldboyedu-lnb 20200118]# echo $test
$time-alex
[root@oldboyedu-lnb 20200118]#  echo '$LANG $(which mkdir)  {a..z}'
$LANG $(which mkdir)  {a..z}
[root@oldboyedu-lnb 20200118]#  echo "$LANG $(which mkdir)  {a..z}"
en_US.UTF-8 /usr/bin/mkdir  {a..z}
[root@oldboyedu-lnb 20200118]#  echo $LANG $(which mkdir)  {a..z}
en_US.UTF-8 /usr/bin/mkdir a b c d e f g h i j k l m n o p q r s t u v w x y z
[root@oldboyedu-lnb 20200118]# ll "stu*.txt"
-rw-r--r-- 1 root root 0 Aug  5 11:54 stu*.txt

PS:通配符不支持双引号在find中支持