Centos7.5-重定向和文件的查找

本節所講內容:

  • 11.1文件描述符 0、1、2
  • 11.2重定向的含義-管道的使用-tee命令
  • 11.3 which-whereis-locate-grep-find查找命令
  • 11.4 命令判斷

LINUX下一切皆文件

  • 文件又可分爲:普通文件、目錄文件、鏈接文件、設備文件
  • LINUX系統使用文件來描述各種硬件設備資源,如:/dev/sda /dev/sdb /dev/sr0

11.1 文件描述符定義

文件描述符:是內核爲了高效管理已被打開的文件所創建的索引,用於指向被打開的文件,所有執行I/O操作的系統調用都通過文件描述符;文件描述符是一個簡單的非負整數,用以標明每一個被進程所打開的文件,程序剛剛啓動的時候,第一個打開的文件是0,第二個是1,依此類推。也可以理解爲是一個文件的身份ID
用戶通過操作系統處理信息的過程中,使用的交互設備文件(鍵盤,鼠標,顯示器)

在這裏插入圖片描述

11.1.1 輸入輸出標準說明

  • STDIN 標準輸入 默認的設備是鍵盤 文件編號爲:0
  • STDOUT 標準輸出 默認的設備是顯示器 文件編號爲:1 ,也可以重定向到文件
  • STDERR 標準錯誤 默認的設備是顯示器 文件編號爲:2 ,也可以重定向到文件
    在這裏插入圖片描述

查看一個進程打開了哪些文件?
語法: ll /proc/進程ID/fd
例1:
[root@xuegod63 ~]# vim /etc/passwd

[root@xuegod63 ~]# ps -axu | grep passwd
root      4602  2.1  0.2 151600  5300 pts/2    S+   15:30   0:00 vim /etc/passwd
[root@xuegod63 ~]# ll /proc/4602/fd    #查看打開的文件

總用量 0

lrwx------ 1 root root 64 5月  14 15:30 0 -> /dev/pts/2
lrwx------ 1 root root 64 5月  14 15:30 1 -> /dev/pts/2
lrwx------ 1 root root 64 5月  14 15:30 2 -> /dev/pts/2
lrwx------ 1 root root 64 5月  14 15:30 4 -> /etc/.passwd.swp

注: 這些0,1,2,4就是文件的描述符。一個進程啓動時,都會打開 3 個文件:標準輸入、標準輸出和標準出錯處理。這3 個文件分別對應文件描述符爲 0、1和2也就是宏替換 STDIN_FILENO、STDOUT_FILENO和STDERR_FILENO。
/proc/進程ID/fd #這個fd目錄下,專門存文件描述符

注:對文件描述符的操作就是對文件本身的操作。 我可以直接通過操作文件描述來修改文件。
例3:查看和臨時設置一個進程最多可以打開幾個文件,即:一個進程可以打開的文件描述符限制

[root@xuegod63 ~]# ulimit -n   #查看一個進程最多可以同時打開的文件數
1024
[root@xuegod63 ~]# ulimit -n 2048  #修改一個進程最多可以同時打開的文件數爲2048
[root@xuegod63 ~]# ulimit -n
2048
永久修改,會在第三階段講系統調優時講。

11.2 重定向的含義-管道的使用-tee命令

11.2.1 輸出重定向

定義:將命令的正常輸出結果保存到指定的文件中,而不是直接顯示在顯示器的屏幕上
重定向輸出使用”>” “>>” 操作符號

語法: > 文件名 #表示將標準輸出的內容,寫到後面的文件中,如果此文件名已經存在,將會覆蓋原文件中的內容
>> 文件名 #表示將標準輸出的內容,追加到後面的文件中。若重定向的輸出的文件不存在,則會新建該文件
例1:查看當前主機的CPU的類型保存到cpu.txt文件中(而不是直接顯示到屏幕上)

[root@xuegod63 ~]# cat /proc/cpuinfo > cpu.txt

例2:將內核的版本信息追加到cpu.txt

[root@xuegod63 ~]# uname -a >> cpu.txt

例3:清空一個文件

[root@xuegod63 ~]# > cpu.txt

11.2.2 輸入重定向

例1:將命令中接收輸入的途徑由默認的鍵盤改爲其他文件.而不是等待從鍵盤輸入

[root@xuegod63 mnt]# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@xuegod63 mnt]# grep root < /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

例2:mysql中數據導入

例: [root@xuegod63 ~]#  mysql -uroot -p123456 < xuegod.sql  #將xuegod.sql導入mysql數據庫中。 這個命令現在不能執行,大家先知道有這種寫法就可以了。後期在第二階段講mysql時,會講。

11.2.3 EOF

EOF本意是 End Of File,表明到了文件末尾。”EOF“通常與”<<“結合使用,“<<EOF“表示後續的輸入作爲子命令或子shell的輸入,直到遇到”EOF“,再次返回到主調shell,可將其理解爲分界符(delimiter)。既然是分界符,那麼形式自然不是固定的,這裏可以將”EOF“可以進行自定義,但是前後的”EOF“必須成對出現且不能和shell命令衝突。
例1:以<<EOF開始,以EOF結尾 。

[root@bogon ~]# cat > a.txt <<EOF
> dfsd
> sdfs
> sdf
> dfs
> EOF
[root@bogon ~]# cat a.txt 
dfsd
sdfs
sdf
dfs

例2:以ccc作爲分界符

[root@localhost ~]# cat a.txt <<ccc
> eof
> EOF
> ccc
[root@localhost ~]# cat a.txt 
eof
EOF

例3:在腳本中我們可以通過重定向輸入來打印消息菜單

在使用的時候需要在”<< “右邊跟一對終止符。終止符是可以自定義
[root@xuegod63 mnt]# vim   p.sh   #寫入以下內容  
#!/bin/bash

cat <<efo
1.mysql
2.httpd
3.oracle

efo

[root@xuegod63 ~]# chmod +x
[root@xuegod63 ~]# p.sh  #查看效果

11.2.4 錯誤重定向

將命令執行過程中出現的錯誤信息 (選項或參數錯誤) 保存到指定的文件,而不是直接顯示到顯示器

  • 作用:錯誤信息保存到文件
  • 操作符: 錯誤重定向符號:2> ; 標準輸入: 1< 或簡寫 < ; 標準輸出: 0> 或 >
    2指的是標準錯誤輸出的文件描述符 (在使用標準的輸入和輸出省略了1、0 編號)

在實際應用中,錯誤重定向可以用來收集執行的錯誤信息.爲排錯提供依據;對於shell腳本還可以將無關緊要的錯誤信息重定向到空文件/dev/null中,以保持腳本輸出的簡潔
例1: 將錯誤顯示的內容和正確顯示的內容分開

[root@xuegod63 mnt]# ls /etc/passwd xxx
ls: 無法訪問xxx: 沒有那個文件或目錄
/etc/passwd
[root@xuegod63 mnt]# ls /etc/passwd xxx > a.txt
ls: 無法訪問xxx: 沒有那個文件或目錄
[root@xuegod63 mnt]# cat a.txt 
/etc/passwd
[root@xuegod63 mnt]# ls /etc/passwd xxx 2> a.txt
/etc/passwd
[root@xuegod63 mnt]# cat a.txt 
ls: 無法訪問xxx: 沒有那個文件或目錄
注:使用 2> 操作符時,會像使用 > 一樣覆蓋目標文件的內容,若追加而不覆蓋文件的內容即可使用 2>> 操作符

11.2.5 null黑洞和zero空文件

1、把/dev/null看作"黑洞",所有寫入它的內容都會永遠丟失. 而嘗試從它那兒讀取內容則什麼也讀不到. 然而 /dev/null對命令行和腳本都非常的有用.

[root@xuegod63 ~]# echo aaaa > /dev/null
[root@xuegod63 ~]# cat /dev/null    #什麼信息也看不到

2、/dev/zero在類UNIX 操作系統中, /dev/zero 是一個特殊的文件,當你讀它的時候,它會提供無限的空字符(NULL, ASCII NUL, 0x00)。典型用法是用它來產生一個特定大小的空白文件。

例:使用dd命令產生一個50M的文件

參數:

if 代表輸入文件。如果不指定if,默認就會從stdin中讀取輸入。
of 代表輸出文件。如果不指定of,默認就會將stdout作爲默認輸出。
bs 代表字節爲單位的塊大小。
count 代表被複制的塊數。
[root@xuegod63 mnt]# dd if=/dev/zero of=b.txt bs=1M count=50
50+0 records in
50+0 records out
52428800 bytes (52 MB) copied, 0.228653 s, 229 MB/s
[root@xuegod63 mnt]# du -sh b.txt 
50M b.txt
[root@xuegod63 mnt]# cat b.txt  #什麼也不顯示 

例2:正確的內容寫入一個文件,錯誤的寫入一個文件

[root@xuegod63 mnt]# ls /tmp  xxxx  >ok.txt  2> err.txt

11.2.6 &>和>&符號

&表示等同於的意思
例1:把正確和錯誤的消息輸入到相同的位置
    1>&2  把標準輸出重定向到標準錯誤
    2>&1  把標準錯誤重定向到標準輸出,如圖:

在這裏插入圖片描述

例2:把正確和錯誤的消息輸入到相同的位置

在這裏插入圖片描述
[root@xuegod63 mnt]# ls /tmp xxxx >1.txt 2>&1

或:

[root@xuegod63 mnt]# ls /tmp xxxx   2>2.txt  1>&2

例3:互動: 工作中shell腳本中的 >/dev/null 2>&1 是什麼意思?

[root@xuegod63 ~]# cat /etc/passwd >/dev/null 2>&1

注:將標準輸出和錯誤輸出全部重定向到/dev/null中,也就是將產生的所有信息丟棄.

11.2.7 管道 | 的使用

語法:command-a | command-b | command-c | ......

在這裏插入圖片描述

注意:

  • 1、管道命令只處理前一個命令正確輸出,不處理錯誤輸出
  • 2、管道右邊的命令,必須能夠接收標準輸入的數據流命令才行
  • 3、管道符可以把兩條命令連起來,它可以鏈接多個命令使用

    [root@xuegod63 ~]# ps -axu | grep sshd
    root 1089 0.0 0.2 105996 4088 ? Ss 20:19 0:00 /usr/sbin/sshd -D
    root 43262 0.0 0.0 112680 984 pts/1 S+ 21:36 0:00 grep --color=auto sshd

11.2.8 tee命令(瞭解)

  • 功能:讀取標準輸入的數據,並將其內容輸出成文件。
  • 語法:tee [-a][--help][--version][文件...]
  • 參數:
  • -a, --append 內容追加到給定的文件而非覆蓋 --help  在線幫助 tee指令會從標準輸入設備讀取數據,將其內容輸出到標準輸出設備,同時保存成文件
    在這裏插入圖片描述

例1:將磁盤使用的信息寫入文件

[root@xuegod63 ~]# df -h | tee disk.log

例2:將文件系統使用的信息追加到文件

[root@xuegod63 ~]# df -h | tee -a disk.log

注: 可以使用來記錄日誌

11.3 which-whereis-locate-grep-find查找命令

11.3.2 which-whereis-locate-grep find命令使用

查找文件一般有以下幾個命令:

  • which 查看可執行文件的位置
  • whereis 查看可執行文件的位置及相關文件
  • locate 配合數據庫緩存,快速查看文件位置
  • grep 過濾匹配,它是一個文件搜索工具

  • find 查找相關文件

舉例:

[root@xuegod63 ~]# which cd
/usr/bin/cd
[root@xuegod63 ~]# whereis cd
cd: /usr/bin/cd /usr/share/man/man1/cd.1.gz /usr/share/man/man1p/cd.1p.gz
[root@xuegod63 ~]# whereis ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/man1p/ls.1p.g
locate
locate命令和find -name 功能差不多,是它的另外一種寫法,但是這個要比find搜索快的多,因爲find命令查找的是具體目錄文件,而locate它搜索的是一個數據庫/var/lib/mlocate/mlocate.db,這個數據庫中存有本地所有的文件信息;這個數據庫是Linux自動創建並每天自動更新維護。相關的配置信息在/etc/updatedb.conf,查看定時任務信息在/etc/cron.daily/mlocate
[root@xuegod63 mnt]# touch /opt/xuegod.txt
[root@xuegod63 mnt]# locate xuegod.txt   #發現找不到
[root@xuegod63 mnt]# updatedb    #如果對當天文件查找,需要手動更新數據庫updatedb
[root@xuegod63 mnt]# locate xuegod

grep查找使用

  • 作用:過濾,它能夠使用正則表達式來搜索文本,並把結果打印出來
  • 參數:

    -v 取反
    -i 忽略大小寫
    ^# 以#開頭
    #$ 以#結尾
    ^$ 空行
    -n 對過濾的內容加上行號
    | 或者的意思
    [root@xuegod63 ~]# ps -aux | grep sshd | grep -v grep
    root 1089 0.0 0.2 105996 4088 ? Ss 20:19 0:00 /usr/sbin/sshd -D

    [root@xuegod63 ~]# grep bash$ /etc/passwd #以bash結尾

    [root@xuegod63 ~]# grep "nologin|root" /etc/passwd | wc -l
    36
    注: \ 表示轉義符
    [root@xuegod63 ~]# egrep "nologin|root" /etc/passwd | wc -l #查看包括nologin或root的行
    36
    注:egrep 是 grep加強版本

11.3.2 find命令使用(必會,參數比較多)

格式:find pathname -options [-print]
命令字 路徑名稱 選項 輸出
參數:

pathname:  find命令所查找的目錄路徑,不輸入代表當前目錄例如用 . 來表示當前目錄,用 / 來表示系統根目錄。
find命令選項:
-name   按照文件名查找文件。  “名稱”
-perm   按照文件權限來查找文件。666 777 等
-user   按照文件屬主來查找文件
-group  按照文件所屬的組來查找文件
-mtime  -n  / +n    按照文件的更改時間來查找文件,
             - n    表示文件更改時間距現在n天以內
             + n    表示文件更改時間距現在n天以前
-type   查找某一類型的文件
            b - 塊設備文件
            d - 目錄
            c - 字符設備文件
            p - 管道文件
            l- 符號鏈接文件
            f - 普通文件
-size n  查找符合指定的文件大小的文件
-exec      對匹配的文件執行該參數所給出的其他linux命令, 相應命令的形式爲' 命令 {} \;,注意{ }和 \;之間的空格,{}代表查到的內容

例1:查看當前目錄下所有的TXT格式的文件

[root@xuegod63 mnt]# find . -name "*.txt"
./a.txt
./xuegod.txt

2、按照更改時間或訪問時間等查找文件

如果希望按照更改時間來查找文件,可以使用mtime,atime或ctime選項
        mtime:  文件最後一次修改的時間
        atime:  最後一次訪問時間
        ctime:  文件的最後一次變化時間,也就是修改時間

**例1:希望在root目錄下查找更改時間在1天以內,被*修改的文

[root@xuegod63 ~]# find /root/ -mtime -1
c3、對查找內容執行相應命令
-exec    這個選項參數後面可以跟自定義的SHELL命令,格式如下:

在這裏插入圖片描述
例2:

[root@xuegod63 ~]# touch {1,2,3}.back
[root@xuegod63 mnt]# find . -name "*.back" -exec ls -l {} \;

例3:

[root@xuegod63 ~]#  find . -name "*.back" -exec mv {} /opt \;
[root@xuegod63 ~]# ls /opt/
1.back  2.back  3.back  rh  xuegod.txt

例4:把查找到的文件複製到一個指定的目錄

[root@xuegod63 mnt]# find /root -name "*.txt" -exec cp {} /opt  \;

例5:xargs和find命令結合 複製文件 -i 表示 find 傳遞給xargs的結果 由{}來代替 (瞭解)

[root@xuegod63 ~]# rm -rf /opt/*
[root@xuegod63 ~]# find . -name "*.txt"  | xargs  -i cp {}  /opt
[root@xuegod63 ~]# ls /opt/

例6:查找多個類型文件
**比較符的使用:
-a and 並且
-o or 或者

  • 超過

    • 低於**

    [root@xuegod63 ~]# touch a.pdf back.sh
    [root@xuegod63 ~]# find . -name ".sh" -o -name ".pdf"
    [root@xuegod63 ~]# find /etc -size +20k -a -size -50k | wc -l
    22
    [root@xuegod63 ~]# find /etc -size +20k | wc -l
    49

例7: 按權限查找:-perm

[root@xuegod63 ~]# find /bin/ -perm 755   # 等於0755權限的文件或目錄
[root@xuegod63 ~]# find /bin/ -perm  -644   #-perm -644  至少有644權限的文件或目錄

例:查看系統中權限至少爲777的文件或目錄
創建一些測試文件:

[root@xuegod63 ~]# mkdir ccc
[root@xuegod63 ~]# chmod 777 ccc
[root@xuegod63 ~]# mkdir test
[root@xuegod63 ~]# chmod 1777 test
 [root@xuegod63 ~]# touch b.sh
[root@xuegod63 ~]# chmod 4777 b.sh

查找:

[root@xuegod63 ~]# find /root/ -perm 777 
[root@xuegod63 ~]# find /root/ -perm 1777 
[root@xuegod63 ~]# find /root/ -perm  4777 

例:把系統中權限不低於777的危險目錄查找出來

[root@xuegod63 ~]# find /root/ -perm  -777 

例:把系統中權限不低於777的危險文件查找出來

[root@xuegod63 ~]# find / -type f -perm  -777

例8:查找的目錄深度:

-maxdepth 1  #只查找目錄第一層的文件和目錄

如:查找/bin目錄下權限等於755的可執行的文件

[root@xuegod63 ~]# find /bin/ -maxdepth 1 -perm 755  #/bin後面要有/
[root@xuegod63 ~]# find /bin -maxdepth 1 -perm 755  #這個命令無法滿足我們的需求

例9:查找系統中所有屬於用戶mk的文件,並把這個文件,放到/root/findresults目錄下
注意:/root/findresults這個需要提前創建好。

[root@xuegod63 ~]# mkdir /root/findresults

[root@xuegod63 ~]# find / -user mk -exec cp -a {} /root/findresults/  \;
#參數: -a  #複製時,保留原來文件的所有屬性
報錯:
find: ‘/proc/43475/task/43475/fd/6’: 沒有那個文件或目錄
find: ‘/proc/43475/task/43475/fdinfo/6’: 沒有那個文件或目錄
find: ‘/proc/43475/fd/6’: 沒有那個文件或目錄
find: ‘/proc/43475/fdinfo/6’: 沒有那個文件或目錄
cp: 無法以目錄"/home/mk" 來覆蓋非目錄"/root/findresults/mk" 

互動: 同一個目錄下,可以創建文件mk和文件夾mk嗎?同一個目錄下創建的文件名和目錄名一樣嗎?
答:不可以
解決:

[root@xuegod63 ~]# find / -user mk  #發現
[root@xuegod63 ~]# ll /var/spool/mail/mk  #查看這個文件
[root@xuegod63 ~]# ll /home/mk   
發現/var/spool/mail/mk 和/home/mk 的名字是一樣的。 而兩者都要複製到/root/findresults/下,先複製了/var/spool/mail/mk,所以/home/mk就不能複製了。
[root@xuegod63 ~]# mv /var/spool/mail/mk  /var/spool/mail/mk.mail
[root@xuegod63 ~]# rm -rf /root/findresults/*
[root@xuegod63 ~]# find / -user mk -exec cp -a {} /root/findresults/  \;
[root@xuegod63 ~]# mv /var/spool/mail/mk.mail  /var/spool/mail/mk  #再修改過來

11.4 命令判斷

11.4.1 用到的三個特殊符號: ; && ||

1、 ;分號 不考慮指令的相關性,連續執行, 分號; 不保證命令全部執行成功的

  • 例:[root@xuegod63 mnt]# sync ; shutdown -F

&& 邏輯與====》它是只有在前面的命令執行成功後,後面的命令纔會去執行

  • 例1:如果/opt目錄存在,則在/opt下面新建一個文件a.txt

    [root@xuegod63 ~]# cd /opt/ && touch /opt/a.txt && ls

例2:源碼編譯經典使用方法

[root@xuegod63 ~]# ./configure  &&  make -j 4 &&  make install   #我現在沒有源碼包,所以此命令不能執行成功。大家瞭解一下這個經典用法。

2、 || 邏輯或===》如果前面的命令執行成功,後面的命令就不去執行了;或者如果前面的執行不成功,纔會去執行後面的命令
例1:

[root@xuegod63 etc]# ls xxx || cd /mnt
ls: 無法訪問xxx: 沒有那個文件或目錄
[root@xuegod63 mnt]# pwd
/mnt
[root@xuegod63 mnt]# ls /etc/passwd || cd /etc
/etc/passwd

總結:

  • 命令情況 說 明 命令1 && 命令2 如果命令1執行,且執行正確($? = 0),然後執行命令2 如果命令1執行完成,但是執行錯誤($?
    ≠0),那麼後面的命令是不會執行的 命令1 || 命令2 如果命令1執行,且執行正確($? = 0),那麼命令2不執行
    如果命令1執行,但執行錯誤($? ≠ 0),那麼命令2執行
  • 運算順序:LINUX執行命令,是從左到右一個一個執行,從上到下執行

    例:[root@xuegod63 ~]# cd /opt/back || mkdir /opt/back && touch /opt/back/back.tar && ls /opt/back

總結:

  • 11.1文件描述符 0、1、2
  • 11.2重定向的含義-管道的使用-tee命令
  • 11.3 which-whereis-locate-grep-find查找命令
  • 11.4 命令判斷
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章