1. 程式人生 > >Linux系統檔案與目錄管理(1)

Linux系統檔案與目錄管理(1)

Linux 是一套免費使用和自由傳播的類Unix作業系統,是一個基於POSIX和UNIX的多使用者、多工、支援多執行緒和多CPU的作業系統.它能執行主要的UNIX工具軟體、應用程式和網路協議.它支援32位和64位硬體.Linux繼承了Unix以網路為核心的設計思想,是一個性能穩定的多使用者網路作業系統.

在這個章節當中,我們就直接來進一步的操作與管理檔案與目錄吧,包括在不同的目錄間變換、建立與刪除目錄、建立與刪除檔案,還有尋找檔案、查閱檔案內容等,都會在這個章節作介紹.



檔案與目錄的操作

在Linux系統的檔案與目錄的管理上,不外乎『顯示屬性』、『拷貝』、『刪除檔案』、『移動檔案或目錄』、『重新命名』等常用操作,由於檔案與目錄的管理在 Linux當中是很重要的,尤其是每個人自己家目錄的資料也都需要管理,所以我們來談一談有關檔案與目錄的一些基礎管理部分吧.

◆ls 顯示目錄或檔案◆

ls命令用來顯示目標列表,在Linux系統中是使用率較高的命令.ls命令的輸出資訊可以進行彩色加亮顯示,以分割槽不同型別的檔案,其引數我們會在下面進行說明.

[[email protected] ~]# ls --help

命令語法:[ ls [選項] 檔案或目錄 ]

        -a              #顯示所有檔案,包括隱藏檔案,連同.與..的檔案也列出來
        -A              #顯示所有檔案,包括隱藏檔案,但不列出.與..
        -d              #僅列出目錄
        -f              #直接列出結果不排序
        -h              #檔案大小顯示為B KB MB
        -i              #列出檔案的Inode號
        -l              #以長格式顯示
        -n              #列出uid與gid
        -S              #以檔案容量大小排序(大檔案在前小檔案在後)
        -t              #以時間大小排序(大日期在前小日期在後)
        -r              #將排序結果反向輸出
        -R              #遞迴顯示目錄以及子目錄
        -Z              #列出SELinux安全上下文
        --full-time     #列出檔案詳細時間
        --time=atime/ctime/mtime        #列出指定時間

例項1:使用 ls -lh 引數查詢所在目錄詳細資訊

[[email protected] ~]# ls -lh
total 0
-rw-r--r--. 1 root root 0 Nov 13 09:36 admin
drwxr-xr-x. 2 root root 6 Nov 13 09:36 lyshark

第1項:          檔案許可權位
第2項:          引用計數(檔案:硬連結數 目錄:目錄下的子目錄個數)
第3項:          檔案的所有者(屬主->此處為root)
第4項:          檔案的所屬組(屬組->此處為root)
第5項:          檔案大小(預設單位位元組byte)
第6項:          最後一次修改時間
第7項:          檔名

例項2:使用 ls -lh --full-time 顯示檔案建立的詳細時間資訊

[[email protected] ~]# ls -h --full-time
total 0
-rw-r--r--. 1 root root 0 2018-11-13 09:36:25.172274787 -0500 admin
drwxr-xr-x. 2 root root 6 2018-11-13 09:36:13.292275532 -0500 lyshark

例項3:使用 ls -lhS 顯示檔案,並按照檔案由大到小列印

[[email protected] ~]# ls -lhS
total 0
drwxr-xr-x. 2 root root 6 Nov 13 09:36 lyshark
-rw-r--r--. 1 root root 0 Nov 13 09:36 admin

例項4:使用 ls -lhrS 顯示檔案,並按照檔案由小到大列印

[[email protected] ~]# ls -lhrS
total 0
-rw-r--r--. 1 root root 0 Nov 13 09:36 admin
drwxr-xr-x. 2 root root 6 Nov 13 09:36 lyshark

例項5:使用 ls -lZ 顯示檔案,並顯示SeLinux安全上下文

[[email protected] ~]# ls -lZ 
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 admin
drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 lyshark

◆cd 目錄跳轉與切換◆

cd命令用來切換工作目錄至dirname,其中dirName表示法可為絕對路徑或相對路徑,若目錄名稱省略,則變換至使用者的home directory,.則是表示目前所在的目錄,..則表示目前目錄位置的上一層目錄,其引數我們會在下面進行說明.

[[email protected] ~]# cd --help

命令語法:[ cd [選項] 目錄 ]

        cd              #進入使用者主目錄
        cd ~            #進入使用者主目錄
        cd -            #返回進入此目錄之前所在的目錄
        cd ..           #返回上級目錄
        cd ../..        #返回上兩級目錄
        cd !$           #把上個命令的引數作為cd引數使用

例項1:使用 cd ~ or cd 切換到使用者家目錄

[[email protected] etc]# pwd
/etc

[[email protected] etc]# cd

[[email protected] ~]# pwd
/root

例項2:使用 cd .. 切換上一級目錄裡去

[[email protected] ~]# pwd
/root

[[email protected] ~]# cd ..

[[email protected] /]# pwd
/

例項3:使用 cd ../.. 切換上兩級目錄裡去

[[email protected] sysconfig]# pwd
/etc/sysconfig

[[email protected] sysconfig]# cd ../..

[[email protected] /]# pwd
/

◆mkdir 建立新目錄◆

mkdir命令用來建立目錄,該命令建立由dirname命名的目錄,如果在目錄名的前面沒有加任何路徑名,則在當前目錄下建立由dirname指定的目錄,如果給出了一個已經存在的路徑,將會在該目錄下建立一個指定的目錄,在建立目錄時,應保證新建的目錄與它所在目錄下的檔案沒有重名,其引數我們會在下面進行說明.

[[email protected] ~]# mkdir --help

語法格式:[ mkdir [選項] 新目錄名 ]

        -v              #顯示建立過程
        -p              #遞迴建立目錄
        -Z              #設定安全上下文
        -m              #建立目錄時同時設定許可權

例項1:使用 mkdir -p 遞迴建立目錄

[[email protected] ~]# mkdir -p /tmp/lyshark/lyshark

[[email protected] ~]# ls -lh /tmp/lyshark/
total 0
drwxr-xr-x. 2 root root 6 Nov 13 09:56 lyshark

例項2:使用 mkdir -m 建立目錄時同時設定許可權.

[[email protected] ~]# mkdir -m 000 lyshark

[[email protected] ~]# ls -lh
total 0
d---------. 2 root root 6 Nov 13 10:02 lyshark

◆touch 建立空檔案◆

touch命令有兩個功能,一是用於把已存在檔案的時間標籤更新為系統當前的時間,它們的資料將原封不動地保留下來,二是用來建立新的空檔案,多數情況下我們只是用它來建立空檔案,其引數我們會在下面進行說明.

[[email protected] ~]# touch --help

語法格式:[ touch [選項] 檔名 ]

        -a              #修改訪問時間
        -c              #修改檔案時間,若檔案不存在則不建立新檔案
        -m              #僅修改mtime
        -t              #修改檔案時間(touch -t 1806101012)

例項1:使用 touch 命令在當前目錄下建立一個空檔案lyshark.txt.

[[email protected] ~]# ls -lh
total 0

[[email protected] ~]# touch lyshark.txt

[[email protected] ~]# ls -lh
total 0
-rw-r--r--. 1 root root 0 Nov 13 10:32 lyshark.txt

例項2:使用 touch -t 命令修改檔案的時間改成15年11月03日11點59分.

[[email protected] ~]# ls -lh --full-time
total 0
-rw-r--r--. 1 root root 0 2018-11-13 10:35:50.639051120 -0500 lyshark.txt

[[email protected] ~]# touch -t 1511031159 lyshark.txt 

[[email protected] ~]# ls -lh --full-time
total 0
-rw-r--r--. 1 root root 0 2015-11-03 11:59:00.000000000 -0500 lyshark.txt

◆cp 複製檔案或目錄◆

cp命令用來將一個或多個原始檔或者目錄複製到指定的目的檔案或目錄,它可以將單個原始檔複製成一個指定檔名的具體的檔案或一個已經存在的目錄下.cp命令還支援同時複製多個檔案,當一次複製多個檔案時,目標檔案引數必須是一個已經存在的目錄,否則將出現錯誤,其引數我們會在下面進行說明.

[[email protected] ~]# cp --help

語法格式:[ cp [選項] 原始檔或目錄 目標目錄 ]

        -a              #相當於pdr
        -d              #連同連結檔案的屬性一起復制
        -f              #強制複製
        -i              #如目標檔案已存在,則覆蓋時詢問
        -p              #連同檔案屬性一起復制(備份常用)
        -r              #遞迴複製,用於目錄的複製
        -s              #複製時建立軟連線
        -u              #原始檔更新時才會提示覆制

例項1:使用 cp -a 命令實現檔案拷貝,將/etc/的檔案拷貝到/tmp/目錄下.

[[email protected] ~]# cp -a /etc/* /tmp/

[[email protected] ~]# ls -lh /tmp/
total 1.1M
-rw-r--r--.  1 root root     16 Oct 13 12:37 adjtime
-rw-r--r--.  1 root root   1.5K Jun  7  2013 aliases
-rw-r--r--.  1 root root    12K Oct 13 12:39 aliases.db
drwxr-xr-x.  2 root root    236 Oct 13 12:34 alternatives
....省略....

例項2:使用 cp -s 命令實現拷貝檔案,將/etc/passwd建立軟連結到/tmp/目錄下.

[[email protected] ~]# cp -s /etc/passwd /tmp/

[[email protected] ~]# ls -lh /tmp/
total 0
lrwxrwxrwx. 1 root root 11 Nov 13 10:09 passwd -> /etc/passwd

例項3:使用 cp -a 命令實現一次拷貝多個檔案,到/tmp/目錄下.

[[email protected] ~]# cp -a /etc/passwd /etc/shadow /tmp/

[[email protected] ~]# ls -lh /tmp/
total 8.0K
-rw-r--r--. 1 root root 898 Oct 13 12:37 passwd
----------. 1 root root 714 Oct 13 12:37 shadow

◆mv 移動檔案或目錄◆

mv命令用來對檔案或目錄重新命名,或將檔案從一個目錄移到另一個目錄中.source表示原始檔或目錄,target表示目標檔案或目錄.如果將一個檔案移到一個已經存在的目標檔案中,則目標檔案的內容將被覆蓋,其引數我們會在下面進行說明.

[[email protected] ~]# mv --help

語法格式:[ mv [選項] 原始檔或目錄 目標目錄 ]

        -f              #強制移動
        -i              #以互動方式移動
        -u              #原始檔更新才會移動

例項1:使用 mv 命令實現將/etc/passwd移動到/tmp目錄下.

[[email protected] ~]# mv /etc/passwd /tmp/

[[email protected] ~]# ls -lh /tmp/
total 4.0K
-rw-r--r--. 1 0 root 898 Oct 13 12:37 passwd

例項2:使用 mv 命令實現一次移動多個檔案,下面將/etc/passwd和/etc/shadow 移動到/tmp目錄下.

[[email protected] ~]# mv /etc/passwd /etc/shadow /tmp/

[[email protected] ~]# ls -lh /tmp/
total 8.0K
-rw-r--r--. 1 0 root 898 Oct 13 12:37 passwd
----------. 1 0 root 714 Oct 13 12:37 shadow

例項3:使用 mv 命令實現重新命名,將當前目錄下的lyshark改名為linux.

[[email protected] ~]# ls -lh
total 0
drwxr-xr-x. 2 root root 6 Nov 13 10:19 lyshark

[[email protected] ~]# mv lyshark/ linux

[[email protected] ~]# ls -lh
total 0
drwxr-xr-x. 2 root root 6 Nov 13 10:19 linux

◆rm 刪除檔案或目錄◆

rm命令可以刪除一個目錄中的一個或多個檔案或目錄,也可以將某個目錄及其下屬的所有檔案及其子目錄均刪除掉.對於連結檔案,只是刪除整個連結檔案,而原有檔案保持不變,使用rm命令要格外小心,因為一旦刪除了一個檔案,就無法再恢復它,其引數我們會在下面進行說明.

[[email protected] ~]# rm --help

語法格式:[ rm [選項] 檔案或目錄 ]

        -f              #不提示警告資訊,直接刪除
        -r              #遞迴刪除
        -i              #刪除前提示
        -fr             #常用搭配

例項1:使用 rm -fr 命令刪除當前目錄下的linux目錄.

[[email protected] ~]# ls
linux
[[email protected] ~]# rm -fr linux/
[[email protected] ~]# ls

例項2:使用 rm -fr * 命令使用萬用字元,刪除指定資料夾內的所有檔案.

[[email protected] lyshark]# ls
1  10  2  3  4  5  6  7  8  9

[[email protected] lyshark]# rm -fr *
[[email protected] lyshark]# ls

◆file 判斷檔案的型別◆

file命令用來檢測給定檔案的型別,file命令對檔案的檢查分為檔案系統、魔法幻數檢查和語言檢查3個過程,其引數我們會在下面進行說明.

[[email protected] ~]# file --help

語法格式:[ file [選項] 檔案或目錄 ]

        -b              #列出辨識結果時,不顯示檔名稱
        -c              #詳細顯示指令執行過程
        -f 檔名        #在檔案中一次讀取並判斷格式
        -z              #查詢壓縮包資訊

例項1:使用 file 命令判斷/etc/passwd 和 /bin/bash 檔案的格式.

[[email protected] ~]# file /etc/passwd
/etc/passwd: ASCII text

[[email protected] ~]# file /bin/bash
/bin/bash: ELF 64-bit LSB executable, x86-64, version 1 (SYSV),
dynamically linked (uses shared libs), for GNU/Linux 2.6.32,
BuildID[sha1]=9a57e086388119ecd285c4d5c66823f3f3b68ab5, stripped

例項2:使用 file -z 命令讀取lyshark.tar.gz壓縮包檔案屬性.

[[email protected] ~]# ls -lh
total 9.4M
-rw-r--r--. 1 root root 9.4M Nov 13 10:51 lyshark.tar.gz

[[email protected] ~]# file -z lyshark.tar.gz 
lyshark.tar.gz: POSIX tar archive (GNU) ,
(gzip compressed data, from Unix, last modified: Tue Nov 13 10:51:13 2018)

例項3:使用 file -f 命令在檔案中讀取指定行,並依次判斷檔案.

[[email protected] ~]# cat temp 
/etc/passwd
/etc/shadow
/bin/bash
/bin/ls

[[email protected] ~]# file -f temp 
/etc/passwd: ASCII text
/etc/shadow: ASCII text

/bin/bash:   ELF 64-bit LSB executable, x86-64, version 1 (SYSV), 
dynamically linked (uses shared libs), for GNU/Linux 2.6.32, 
BuildID[sha1]=9a57e086388119ecd285c4d5c66823f3f3b68ab5, stripped

/bin/ls:     ELF 64-bit LSB executable, x86-64, version 1 (SYSV), 
dynamically linked (uses shared libs), for GNU/Linux 2.6.32, 
BuildID[sha1]=ec3f3e5e8160c9917e8a4b896fe9044748472991, stripped

◆stat 查詢檔案狀態◆

stat命令用於顯示檔案的狀態資訊,stat命令的輸出資訊比ls命令的輸出資訊要更詳細,其引數我們會在下面進行說明.

[[email protected] ~]# stat --help

語法格式:[ stat [選項] 檔案或目錄 ]

        -L              #支援符號連線
        -f              #顯示檔案系統狀態而非檔案狀態
        -t              #以簡潔方式輸出資訊

例項1:使用 stat 命令查詢/bin/bash和/etc/passwd的相信資訊.

[[email protected] ~]# stat /bin/bash
  File: ‘/bin/bash’
  Size: 964544      Blocks: 1888       IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 50340311    Links: 1
Access: (0755/-rwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:shell_exec_t:s0
Access: 2018-11-13 09:33:12.197999579 -0500
Modify: 2017-09-26 09:14:20.000000000 -0400
Change: 2018-10-13 12:32:43.377997461 -0400
 Birth: -

[[email protected] ~]# stat /etc/passwd
  File: ‘/etc/passwd’
  Size: 898         Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 17175992    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:passwd_file_t:s0
Access: 2018-11-13 10:19:51.777111271 -0500
Modify: 2018-10-13 12:37:59.147984612 -0400
Change: 2018-11-13 10:19:05.849114152 -0500
 Birth: -

例項2:使用 stat -f 命令顯示系統的狀態資訊.

[[email protected] ~]# stat -f /bin/bash
  File: "/bin/bash"
    ID: fd0000000000 Namelen: 255     Type: xfs
Block size: 4096       Fundamental block size: 4096
Blocks: Total: 4452864    Free: 4155020    Available: 4155020
Inodes: Total: 8910848    Free: 8877953

◆ln 建立連結檔案◆

ln命令用來為檔案創件連線,連線型別分為硬連線和符號連線兩種,預設的連線型別是硬連線,如果要建立符號連線必須使用"-s"選項,符號連結檔案不是一個獨立的檔案,它的許多屬性依賴於原始檔,所以給符號連結檔案設定存取許可權是沒有意義的,其引數我們會在下面進行說明.

[[email protected] ~]# ln --help

語法格式:[ stat [選項] 檔案或目錄 ]

        -L              #支援符號連線
        -d              #建立目錄的硬連結
        -f              #強制建立連結
        -i              #覆蓋前詢問
        -s              #建立一個軟連結

例項1:使用 ln 命令建立一個硬連結.

[[email protected] ~]# ls -lhi
total 944K
33844798 -rwxr-xr-x. 1 root root 942K Sep 26  2017 bash

[[email protected] ~]# ln bash bash_ln
[[email protected] ~]# ls -lhi
total 1.9M
33844798 -rwxr-xr-x. 2 root root 942K Sep 26  2017 bash
33844798 -rwxr-xr-x. 2 root root 942K Sep 26  2017 bash_ln

例項2:使用 ln -s 命令建立一個軟連結.

[[email protected] ~]# ls -lhi
total 944K
33844798 -rwxr-xr-x. 1 root root 942K Sep 26  2017 bash

[[email protected] ~]# ln -s bash bash_link
[[email protected] ~]# ls -lhi
total 944K
33844798 -rwxr-xr-x. 1 root root 942K Sep 26  2017 bash
33959316 lrwxrwxrwx. 1 root root    4 Nov 13 11:06 bash_link -> bash


檔案內容查閱命令

如果我們要查閱一個檔案的內容時,這裡有相當多有趣的命令可以來分享一下,最常使用的顯示檔案內容的命令可以說是 cat 與 more 及 less 了,此外如果我們要檢視一個很大型的檔案(好幾百MB時),但是我們只需要後端的幾行字而已,此時我們可以使用tail命令檢視後面的行,當然是用tac命令也可以達到相應效果,下面開始說說各個命令的用途吧.

◆cat 文字列印命令◆

cat命令連線檔案並列印到標準輸出裝置上,cat經常用來顯示檔案的內容,當檔案較大時,文字在螢幕上迅速閃過(滾屏),使用者往往看不清所顯示的內容,為了控制滾屏,可以按Ctrl+S鍵停止滾屏,按Ctrl+Q鍵可以恢復滾屏,按Ctrl+C(中斷)鍵可以終止該命令的執行,並且返回Shell提示符狀態,其引數我們會在下面進行說明.

[[email protected] ~]# cat --help

語法格式:[ cat [選項] 檔名 ]

        -b              #列出行號,空白行不標號
        -E              #將結尾段行符$顯示出來
        -T              #將Tab鍵以^I顯示出來
        -n              #打印出行號

例項1:使用 cat -n 命令給指定文字標號並列印.

[[email protected] ~]# cat -n /etc/passwd
     1  root:x:0:0:root:/root:/bin/bash
     2  bin:x:1:1:bin:/bin:/sbin/nologin
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     6  sync:x:5:0:sync:/sbin:/bin/sync
....省略....

例項2:使用 cat -E 命令顯示文字結束符$.

[[email protected] ~]# cat -E /etc/passwd
root:x:0:0:root:/root:/bin/bash$
bin:x:1:1:bin:/bin:/sbin/nologin$
daemon:x:2:2:daemon:/sbin:/sbin/nologin$
adm:x:3:4:adm:/var/adm:/sbin/nologin$
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin$
sync:x:5:0:sync:/sbin:/bin/sync$
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown$
....省略....

◆head 顯示開頭文字◆

head命令用於顯示檔案的開頭的內容,在預設情況下,head命令顯示檔案的頭10行內容,其引數我們會在下面進行說明.

[[email protected] ~]# head --help

語法格式:[ head [選項] 檔名 ]

        -c 10           #顯示前10個字元
        -n 10           #顯示前10行
        -v              #總是顯示檔名的頭資訊
        -q              #不顯示檔名的頭資訊

例項1:使用 head -c 命令顯示文字的前20個字元.

[[email protected] ~]# head -c 20 /etc/passwd
root:x:0:0:root:/roo

[[email protected] ~]# 

例項2:使用 head -n 命令顯示文字前3行.

[[email protected] ~]# head -n 3 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

◆tail 顯示結尾文字◆

tail命令用於輸入檔案中的尾部內容,tail命令預設在螢幕上顯示指定檔案的末尾10行,如果給定的檔案不止一個,則在顯示的每個檔案前面加一個檔名標題,如果沒有指定檔案或者檔名為"-",則讀取標準輸入,如果表示位元組或行數的N值之前有一個"+"號,則從檔案開頭的第N項開始顯示,而不是顯示檔案的最後N項.N值後面可以有後綴:b表示512,k表示1024,m表示1048576(1M),其引數我們會在下面進行說明.

[[email protected] ~]# tail --help

語法格式:[ tail [選項] 檔名 ]

        -c 10           #顯示後10個字元
        -n 10           #顯示檔案後10行
        -f              #持續監測檔案後面的變化
        --pid=PID       #與-f合用,表示在程序ID,死掉之後結束

例項1:使用 tail -n 命令顯示文字後3行.

[[email protected] ~]# tail -n 3 /etc/passwd
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
lyshark:x:1000:1000:lyshark:/home/lyshark:/bin/bash

例項2:使用 tail -f 命令動態監控一個檔案.

[[email protected] ~]# tail -f /var/log/messages 
Nov 13 10:01:01 localhost systemd: Starting Session 3 of user root.
Nov 13 10:10:54 localhost kernel: e1000: ens32 NIC Link is Down
Nov 13 10:10:58 localhost kernel: e1000: ens32 NIC Link is Up 
Nov 13 10:10:58 localhost NetworkManager[772]: <info>  
....省略....

例項3:使用 tail --pid=PID 命令監視一個程序.

[[email protected] ~]# ps
   PID TTY          TIME CMD
  1404 pts/0    00:00:00 bash
 11441 pts/0    00:00:00 ps
[[email protected] ~]# 
[[email protected] ~]# tail --pid=1401
tail: warning: PID ignored; --pid=PID is useful only when following
....省略....

例項4:使用 tail -n +5 命令從第五行以後開始列印.

[[email protected] ~]# tail -n +5 /etc/passwd
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
....省略....

例項5:使用 tail -n +5 | head -n 3 命令從第五行開始列印,向下列印2行內容.

[[email protected] ~]# tail -n +5 /etc/passwd |head -n 3
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

◆nl 指定格式輸出文字◆

nl命令讀取file引數(預設情況下標準輸入),計算輸入中的行號,將計算過的行號寫入標準輸出.在輸出中,nl命令根據您在命令列中指定的標誌來計算左邊的行,輸入文字必須寫在邏輯頁中,每個邏輯頁有頭、主體和頁尾節(可以有空節),除非使用-p選項,nl命令在每個邏輯頁開始的地方重新設定行號.可以單獨為頭、主體和頁尾節設定行計算標誌其預設的結果與cat -n有點不太一樣,nl可以將行號做比較多的顯示設計,包括位數與是否自動補齊0等等的功能,其引數我們會在下面進行說明.

[[email protected] ~]# nl --help

語法格式:[ nl [選項] 檔名 ]

        -c 10           #顯示後10個字元
        -b a            #列出行號,包括空格(類似 cat -n)
        -b t            #列出行號,不包括空格(類似 cat -n)
        -n ln           #行號顯示在最左邊
        -n rn           #行號顯示在最右邊
        -n rz           #行號顯示在最右邊,並加0補齊
        -w              #指定補齊0的個數

例項1:使用 nl -b a 命令給文字標號列印(類似於cat -n).

[[email protected] ~]# nl -b a /etc/passwd
     1  root:x:0:0:root:/root:/bin/bash
     2  bin:x:1:1:bin:/bin:/sbin/nologin
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     6  sync:x:5:0:sync:/sbin:/bin/sync
....省略....

例項2:使用 nl -b a -n rz 命令列出文字並給予編號,空格0填充.

[[email protected] ~]# nl -b a -n rz /etc/passwd
000001  root:x:0:0:root:/root:/bin/bash
000002  bin:x:1:1:bin:/bin:/sbin/nologin
000003  daemon:x:2:2:daemon:/sbin:/sbin/nologin
000004  adm:x:3:4:adm:/var/adm:/sbin/nologin
000005  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
....省略....

例項3:使用 nl -b a -n rz -w 3 命令列出文字並給予編號,編號填充2行0.

[[email protected] ~]# nl -b a -n rz -w 3 /etc/passwd
001 root:x:0:0:root:/root:/bin/bash
002 bin:x:1:1:bin:/bin:/sbin/nologin
003 daemon:x:2:2:daemon:/sbin:/sbin/nologin
004 adm:x:3:4:adm:/var/adm:/sbin/nologin
005 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
....省略....

◆od 非純文字檔案列印◆

od命令用於輸出檔案的八進位制、十六進位制或其它格式編碼的位元組,通常用於顯示或檢視檔案中不能直接顯示在終端的字元,常見的檔案為文字檔案和二進位制檔案,此命令主要用來檢視儲存在二進位制檔案中的值,其引數我們會在下面進行說明.

[[email protected] ~]# od --help

語法格式:[ od [選項] 檔名 ]

        -t a            #利用預設字元來輸出
        -t c            #使用ASCII字元輸出
        -t d            #使用十進位制輸出
        -t f            #使用浮點數輸出
        -t o            #使用八進位制輸出
        -t x            #使用十六進位制輸出

例項3:使用 od -t a 命令使用預設格式輸出.

[[email protected] ~]# od -t a /bin/cd 
0000000   #   !   /   b   i   n   /   s   h  nl   b   u   i   l   t   i
0000020   n  sp   c   d  sp   "   $   @   "  nl
0000032

例項3:使用 od -t c 命令使用ASCII輸出.

[[email protected] ~]# od -t c /bin/cd 
0000000   #   !   /   b   i   n   /   s   h  \n   b   u   i   l   t   i
0000020   n       c   d       "   $   @   "  \n
0000032

◆more 翻頁瀏覽文字◆

more命令是一個基於vi編輯器文字過濾器,它以全螢幕的方式按頁顯示文字檔案的內容,支援vi中的關鍵字定位操作,more名單中內建了若干快捷鍵,常用的有H(獲得幫助資訊),Enter(向下翻滾一行),空格(向下滾動一屏),Q(退出命令),其引數我們會在下面進行說明.

[[email protected] ~]# more --help

語法格式:[ more 檔名 ]

        空格            #像下翻一頁
        B               #向上翻一頁
        Enter           #向下滾動一行
        /字串          #向下查詢字串
        :f              #立即顯示行號
        q或Q            #退出

例項1:使用 more 命令開啟一個文字.

[[email protected] ~]# more /var/log/messages 
Oct 13 12:39:15 localhost journal: Runtime journal is using 6.0M (max allowed 48.7M, tryi
ng to leave 73.0M free of 481.1M available → current limit 48.7M).
Oct 13 12:39:15 localhost kernel: Initializing cgroup subsys cpuset
Oct 13 12:39:15 localhost kernel: Initializing cgroup subsys cpu
Oct 13 12:39:15 localhost kernel: Initializing cgroup subsys cpuacct
Oct 13 12:39:15 localhost kernel: Linux version 3.10.0-862.el7.x86_64 ([email protected]
build.eng.bos.redhat.com) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC) ) #1 SMP W

--More--(0%)

◆less 可控翻頁瀏覽◆

less命令的作用與more十分相似,都可以用來瀏覽文字檔案的內容,不同的是less命令允許使用者向前或向後瀏覽檔案,而more命令只能向前瀏覽.用less命令顯示檔案時,用PageUp鍵向上翻頁,用PageDown鍵向下翻頁,要退出less程式,應按Q鍵,其引數我們會在下面進行說明.

[[email protected] ~]# less --help

語法格式:[ less [選項] 檔名 ]

        -e              #檔案顯示完成後自動退出
        -f              #強制顯示檔案
        -l              #搜尋時忽略大小寫的差異
        -N              #每一行行首顯示行號

        空格             #向下翻動一頁
        [pageup]        #向上翻動一頁
        /字串          #向下查詢字串
        ?字串          #向上查詢字串
        q               #退出

例項1:使用 less 命令開啟一個文字.

[[email protected] ~]# less -e /var/log/messages

Oct 13 12:39:15 localhost journal: Runtime journal is using 6.0M (max allowed 48.7M, tryi
ng to leave 73.0M free of 481.1M available → current limit 48.7M).
Oct 13 12:39:15 localhost kernel: Initializing cgroup subsys cpuset
Oct 13 12:39:15 localhost kernel: Initializing cgroup subsys cpu
Oct 13 12:39:15 localhost kernel: Initializing cgroup subsys cpuacct
Oct 13 12:39:15 localhost kernel: Linux version 3.10.0-862.el7.x86_64 ([email protected]
build.eng.bos.redhat.com) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC) ) #1 SMP W

/var/log/messages


命令與檔案的查詢

檔案的搜尋可就厲害了,因為我們常常需要知道那個檔案放在哪裡,才能夠對該檔案進行一些修改或維護等動作,有些時候某些軟體配置檔的檔名是不變的,但是各Linux發行版,放置的目錄則不同.此時就得要利用一些搜尋命令將該配置檔的完整檔名捉出來,這樣才能修改嘛.下面我們將介紹這些常用查詢命令.

◆which 查命令絕對路徑◆

which命令用於查詢並顯示給定命令的絕對路徑,環境變數PATH中儲存了查詢命令時需要遍歷的目錄,which指令會在環境變數$PATH設定的目錄裡查詢符合條件的檔案,也就是說,使用which命令,就可以看到某個系統命令是否存在,以及執行的到底是哪一個位置的命令,其引數我們會在下面進行說明.

[[email protected] ~]# which --help

語法格式:[ which [選項] 命令名 ]

        -n 長度      #指定檔名長度
        -p 長度      #指定檔名長度
        -w          #指定輸出時欄位的寬度

例項1:使用 which 命令檢視一個命令是在那個目錄裡.

[[email protected] ~]# which bash
/usr/bin/bash

[[email protected] ~]# which ls
alias ls='ls --color=auto'
    /usr/bin/ls

◆whereis 尋找特定檔案◆

whereis命令用來定位指令的二進位制程式、原始碼檔案和man手冊頁等相關檔案的路徑,該命令只能用於程式名的搜尋,而且只搜尋二進位制檔案(引數-b)、man說明檔案(引數-m)和原始碼檔案(引數-s),如果省略引數,則返回所有資訊,其引數我們會在下面進行說明.

[[email protected] ~]# whereis --help

語法格式:[ whereis [選項] 檔名 ]

        -b              #只找二進位制檔案
        -m              #只找man文件
        -s              #只找原始碼

例項1:使用 where -b 命令只找二進位制檔案.

[[email protected] ~]# whereis -b ifconfig
ifconfig: /usr/sbin/ifconfig

[[email protected] ~]# whereis -m ifconfig
ifconfig: /usr/share/man/man8/ifconfig.8.gz

◆locate 快取查詢檔案◆

locate命令其實是find -name的另一種寫法,但是要比後者快得多,原因在於它不搜尋具體目錄,而是搜尋一個數據庫/var/lib/mlocatedb,這個資料庫中含有本地所有檔案資訊,Linux系統自動建立這個資料庫,並且每天自動更新一次,所以使用locate命令查不到最新變動過的檔案,為了避免這種情況,可以在使用locate之前,先使用updatedb命令,,手動更新資料庫,updatedb命令會根據/etc/updatedb.conf來更新檔案,其引數我們會在下面進行說明.

注意:這裡需要注意的是,locate這個命令預設是不安裝的,我們可以執行 yum install -y mlocate 來安裝它.

[[email protected] ~]# locate --help

語法格式:[ locate [選項] 檔名 ]

        -d 目錄        #指定資料庫所在的目錄
        -i             #忽略大小寫差異
        -r             #後面接正則表示式

例項1:使用 locate 命令查詢一個檔案.

[[email protected] ~]# updatedb 
[[email protected] ~]# locate /etc/passwd
/etc/passwd
/etc/passwd-

◆find 遍歷檔案查詢◆

-name 按檔名查詢

常用查詢萬用字元

\*     #匹配任意一個或多個字元
?     #匹配任意一個字元
[]     #指定範圍,外側加引號

例項1:查詢/var/目錄下,以.log結尾的檔案.

[[email protected] ~]# find /var/ -name "*.log"
/var/log/tuned/tuned.log
/var/log/audit/audit.log
/var/log/anaconda/X.log
/var/log/anaconda/program.log
....省略....

例項2:查詢/root/目錄下,以[1-3之間],結尾是.txt的檔案

[[email protected] ~]# ls
1.txt  2.txt  3.txt  Catalog  File

[[email protected] ~]# find /root/ -name "[1-3].txt"
/root/1.txt
/root/2.txt
/root/3.txt

例項3:查詢/etc/目錄下,開頭是6個任意字元的檔案

[[email protected] ~]# find /etc/ -name "??????"
/etc/grub.d
/etc/grub.d/README
/etc/shells
/etc/init.d
....省略....

-size 根據大小查詢

單位是 block 資料塊  一塊是512位元組

1M -> 1024k -> 2048 塊  (1塊是0.5k 也就是512位元組)

100M -> 102400k -> 204800塊

例項1:查詢/etc/目錄下,小於10k的檔案

[email protected] ~]# find /etc/ -size -10k
/etc/crypttab
/etc/.pwd.lock
/etc/environment
....省略....

例項2:查詢/etc/目錄下,大於1M的檔案

[[email protected] ~]# find /etc/ -size +1M   #查詢大於1M的檔案
/etc/udev/hwdb.bin
/etc/selinux/targeted/active/policy.kern
/etc/selinux/targeted/contexts/files/file_contexts.bin
/etc/selinux/targeted/policy/policy.31
....省略....

#注意:+-號如果沒有,是精確到這麼大,通常都會帶上+或-號表示一個範圍.

-user 根據屬主查詢

例項1:在/root目錄中查詢屬於wang使用者的檔案

[[email protected] ~]# find /root/ -user wang
/root/1.txt
/root/2.txt
/root/3.txt
#注意:系統中要存在該使用者,否則會報錯誤.

-perm 根據許可權查詢

例項1:查詢/boot/目錄中許可權是644的檔案

[[email protected] ~]# find /boot/ -perm 0644
/boot/grub2/device.map
/boot/grub2/i386-pc/gcry_rmd160.mod
/boot/grub2/i386-pc/acpi.mod
/boot/grub2/i386-pc/gcry_rsa.mod
....省略....

-type 根據型別查詢

-type f 二進位制檔案(普通檔案)
-type l 軟連結檔案
-type d 目錄

例項1:查詢/usr/bin/目錄下,型別是二進位制檔案.

[[email protected] ~]# find /usr/bin/ -type f
/usr/bin/cp
/usr/bin/gzip
/usr/bin/alias
/usr/bin/csplit
/usr/bin/bash
....省略....

-time 按時間查詢

按天數   ctime  atime  mtime
按分鐘   cmin   amin     mmin

  c  change   #表示屬性被修改過:所有者、所屬組、許可權
  a  access   #被訪問過(被檢視過)
  m  modify   #表示內容被修改過

例項1:查詢/etc/目錄下,在120分鐘以內,內容被修改過的檔案

[[email protected] ~]# find /etc/ -mmin -120
/etc/
/etc/resolv.conf
/etc/group-
/etc/gshadow-
/etc/group
/etc/gshadow
....省略....

例項2:查詢/etc/目錄下,在7天之前,屬性被修改過的檔案

[[email protected] ~]# find /etc/ -ctime +7
/etc/resolv.conf
/etc/group-
/etc/gshadow-
....省略....

-inum 根據i節點查詢

例項1:有一些檔案的硬連結數量很多,有相同的i節點,查詢其中一個檔案的i節點號,一次性刪除。

[[email protected] ~]# find ./ -inum 1024 -exec rm{} \;   #刪除相同I節點的資料

-and or 邏輯連線符

-a    (and 邏輯與)     
-o    (or  邏輯或)

例項1:在/etc/目錄下,查詢大於1k,並且小於10k的檔案

[[email protected] ~]# find /etc/ -size +1k -a -size -10k
/etc/
/etc/grub.d/00_header
/etc/grub.d/20_ppc_terminfo
/etc/grub.d/00_tuned
/etc/rc.d/init.d/README
/etc/rc.d/init.d/netconsole
/etc/rc.d/init.d/network
/etc/pam.d
....省略....

-exec 命令執行連線符

[查詢格式] find  ...  -exec 命令 {}  \;

{}        #表示find查詢的結果集
\         #是轉義符,不使用命令別名,直接使用命令本身
;         #分號是表示語句的結束.

#注意:固定格式,只能這樣寫.注意中間的空格.

-----------------------------------------------------------------
說明: 轉義符的作用是什麼?

在linux中有一個別名機制,如rm刪除檔案,執行的卻是rm -i(用which rm 可以檢視命令別名),
使用rm刪除檔案前會提示,就是因為rm -i這個引數。如果想使用命令原意,可以在加\轉義,
如:\rm test.txt   則不會提示,直接刪除

例項1:查詢/var/log/目錄下名字以.log結尾的檔案,找到後執行 ls -l 顯示詳細資訊.

[[email protected] ~]# find /var/log/ *.log -exec ls -l {} \;
total 1176
drwxr-xr-x. 2 root   root      204 Sep 18 09:12 anaconda
drwx------. 2 root   root       23 Sep 18 09:12 audit
-rw-------. 1 root   root    53001 Sep 19 00:57 boot.log
-rw-------. 1 root   utmp      384 Sep 18 09:22 btmp
drwxr-xr-x. 2 chrony chrony      6 Apr 12 13:37 chrony
-rw-------. 1 root   root     3523 Sep 19 01:01 cron
-rw-r--r--  1 root   root   119414 Sep 19 00:57 dmesg
-rw-r--r--  1 root   root   119599 Sep 18 23:35 dmesg.old
-rw-r--r--. 1 root   root     1320 Sep 19 00:23 firewalld
-rw-r--r--. 1 root   root      193 Sep 18 09:05 grubby_prune_debug
....

例項2:查詢/etc/目錄下名字以"init*"開頭的檔案,找到後,只列出檔案,過濾掉目錄,並執行 ls -l 顯示詳細資訊.

[[email protected] ~]# find /etc/ -name "init*" -a -type f -exec ls -l {} \;

-rw-r--r--. 1 root root 511 Apr 11 01:09 /etc/inittab
-rw-r--r--. 1 root root 798 Apr 11 01:09 /etc/sysconfig/init
-rwxr-xr-x. 1 root root 5419 Jan  2  2018 /etc/sysconfig/network-scripts/init.ipv6-global
-rw-r--r--. 1 root root 30 Apr 11 14:12 /etc/selinux/targeted/contexts/initrc_context

例項3:查詢/tmp/下,的yum.log檔案,找到後直接刪除.

[[email protected] tmp]# find /tmp/ -name yum.log -exec rm {} \;
[[email protected] tmp]#

例項4:查詢根下,找關於lyshark使用者的所有檔案,找到後直接刪除.

[[email protected] ~]# find / -user lyshark -exec rm -r {} \;

find: ‘/proc/1465/task/1465/fd/6’: No such file or directory
find: ‘/proc/1465/task/1465/fdinfo/6’: No such file or directory
find: ‘/proc/1465/fd/5’: No such file or directory
find: ‘/proc/1465/fdinfo/5’: No such file or directory
find: ‘/root/Catalog’: No such file or directory
find: ‘/home/lyshark’: No such file or directory

#rm -r 連帶目錄一起刪除.報錯原因:-exec 不適合大量傳輸,速率慢導致.

例項5:在根下,查詢lyshark使用者的檔案,找到後刪除,刪除前會提示是否刪除.

[[email protected] ~]# find / -user lyshark -ok rm -r {} \;
find: ‘/proc/1777/task/1777/fd/6’: No such file or directory
find: ‘/proc/1777/task/1777/fdinfo/6’: No such file or directory

< rm ... /root/LyShark > ? y

# -ok的使用和-exec是一樣的,區別是-ok,執行時會提示你是否進行下一步操作.