Linux運維筆記-日常操作命令總結(2)

散盡浮華發表於2016-11-09

 

回想起來,從事linux運維工作已近5年之久了,日常工作中會用到很多常規命令,之前簡單羅列了一些命令:http://www.cnblogs.com/kevingrace/p/5985486.html
今天在這裡,詳細總結下運維工作中常常用到的一些操作命令(依據本人使用經驗而言):

檔案系統結構和基本操作命令                                                                                                                                              

chmod命令:改變許可權

常用用法:chmod -R xxxx FILE
含義:設定檔案或者目錄的許可權屬性,加上R選項,表示遞迴設定目錄下檔案和目錄的許可權屬性
上面有4個x,每個x的值為0-7,如果少於4個,那麼預設在前面用0值補全,即“77”等價於“0077”。為了簡單起見,我們每次使用的時候,都指定4個x好了。
第一個"x":設定SUID(4),SGID(2),STICKY(1)
第二個"x":設定檔案屬主的r許可權(4),w寫許可權(2),x執行許可權(1)
第三個"x":設定檔案所屬組的r許可權(4),w寫許可權(2),x執行許可權(1)
第四個"x":設定其他使用者的r許可權(4),w寫許可權(2),x執行許可權(1)
 
備註:
設定了SUID,會把檔案屬主的"rwx"中的x替換為s[檔案屬主具有x許可權]或者S[檔案屬主不具有x許可權]
設定了SGID,會把檔案所屬組的"rwx"中的x替換為s[檔案所屬組具有x許可權]或者S[檔案所屬組不具有x許可權]
設定了STICKY,會把其他使用者的"rwx"中的x替換為t[其他使用者具有x許可權]或者T[其他使用者不具有x許可權]
 
另外有一個問題需要注意:
1)在清除一般檔案的SUID,SGID,STICKY許可權的時候,可以使用"chmod 0xxx"的形式
2)在清除目錄的SUID,SGID許可權的時候,不可以使用"chmod 0xxx"的形式。在[1]中也提到了一個解決方案,
就是在原先的4個x的基礎上,再加一個或多個前置x,我們取1位0好了,即"0xxxx"的形式。
 
綜上,我們使用"0xxxx"(指定5位)來設定檔案屬主,檔案所屬組,其他使用者的rwx許可權和SUID,SGID,STICKY許可權。

chown命令:改變屬主

常用用法:chown [-R] OWNER FILE
含義:改變檔案的所有者,加上R選項,表示遞迴

通常使用時會加上改變所屬組的部分,即"所屬者.所屬組" 或者 "所屬者:所屬組"
chown [-R] OWNER.GROUP FILE
chown [-R] OWNER:GROUP FILE

chgrp命令:改變屬組

常用用法:chgrp [-R] GROUP FILE
含義:將FILE的使用者組改為GROUP,如果指定了-R選項,那麼遞迴改變

rm命令:刪除檔案

常用用法:rm -rf FILE 
含義:刪除檔案 
-r:如果FILE是目錄,那麼遞迴刪除目錄; 
-f:如果FILE是隻讀檔案,不再提醒,直接刪除

find命令:查詢檔案

一、常用用法
find path [-maxdepth N] test

二、含義與選項
2.1、含義
在指定路徑下,找到符合條件的檔案和目錄。

2.2、選項表示的意思
"path":表示查詢範圍的路徑。 
"-maxdepth N":表示查詢的最深深度為N層。 
"test":查詢需要滿足的條件。

三、常用的test
3.1、關於檔案時間的幾個test
test                  說明
-amin n            以最後訪問檔案block節點中資料的時間為判斷依據,以多少個分鐘為單位
-atime n           以最後訪問檔案block節點中資料的時間為判斷依據,以多少個24小時為單位
-cmin n            以最後修改檔案inode節點中後設資料的時間為判斷依據,以多少個分鐘為單位
-ctime n           以最後修改檔案inode節點中後設資料的時間為判斷依據,以多少個24小時為單位
-mmin n            以最後修改檔案block節點中資料的時間為判斷依據,以多少個分鐘為單位
-mtime n           以最後修改檔案block節點中資料的時間為判斷依據,以多少個24小時為單位

需要注意:在以上6個選項中,數字"n"有3種形式,分別是:n,+n,-n

為了更加透徹完整地理解,可以歸納得到如下結論。
3.1.1)以"多少個分鐘"為單位的選項
第一種情況"n"為"n"
(FileTime-(NowTime-n*UNIT))>0 && (FileTime-(NowTime-n*UNIT))<=UNIT

第二種情況"n"為"+n"
(FileTime-(NowTime-n*UNIT))<0

第三種情況"n"為"-n"
(FileTime-(NowTime-n*UNIT))>0
"n"和"-n"的情況具有一定的重複區域,即某個時刻"n"能夠找到某個檔案,"-n"也能夠找到相同的檔案。

3.1.2)以"多少個24小時"為單位的選項
第一種情況"n"為"n"
(FileTime-(NowTime-(n+1)*UNIT))>0 && (FileTime-(NowTime-(n+1)*UNIT))<=UNIT

第二種情況"n"為"+n"
(FileTime-(NowTime-(n+1)*UNIT))<0

第三種情況"n"為"-n"
(FileTime-(NowTime-n*UNIT))>0

注意:這裡沒有"n+1",避免了"n"和"-n"的情況下的重複區域。

特別備註: 
1)在上述描述中,系統當前時間(NowTime)和檔案相應欄位的時間(FileTime)都表示成以秒為單位;在以"多少個分鐘"為單位的選項中,
UNIT=60(1分鐘有60秒),在以"多少個24小時"為單位的選項中,UNIT=24*60*3600(24小時有24*60*3600秒) 
2)加了"-daystart"選項後,NowTime就變為當日午夜時間

3.1.3)舉一些例子來看
先假設系統當前時間是"2015-06-09 13:35:50"。 
示例1 
那麼find . -amin 10命令,查詢的檔案的"atime"範圍:
2015-06-09 13:25:51 -- 2015-06-09 13:26:50

示例2 
那麼find . -amin -10命令,查詢的檔案的"atime"範圍:
2015-06-09 > 13:25:50[因此,"2015-06-09 13:26:30"就既能通過-amin 10得到,也能通過-amin -10得到]

示例3 
那麼find . -amin +10命令,查詢的檔案的"atime"範圍:
2015-06-09 < 13:25:50

示例4 
那麼find . -atime 5命令,查詢的檔案的"atime"範圍:
2015-06-03 13:35:51 -- 2015-06-04 13:35:50

示例5 
那麼find . -atime -5命令,查詢的檔案的"atime"範圍:
2015-06-04 > 13:35:50

示例6 
那麼find . -atime +5,查詢的檔案的"atime"範圍
2015-06-03 < 13:35:50

3.2、關於檔案許可權的test
test                               說明
-perm mode                 目的檔案的許可權跟"mode"一致
-perm -mode                目的檔案的許可權包含了"mode"
-perm /mode                目的檔案的許可權跟"mode"有交集

3.3、關於檔案型別的test
關於檔案型別的test為"-type c",其中"c"表示檔案型別特徵碼,對於檔案型別特徵碼的介紹:
b                          block (buffered) special
c                          character (unbuffered) special
d                          directory
p                          named pipe (FIFO)
f                          regular file
l                          symbolic link;
s                          socket
D                          door (Solaris)

3.4、關於檔案所屬使用者的test
"-user uname":表示屬於"uname"這個使用者的檔案,"uname"可以是"使用者名稱稱",也可以是"使用者ID,即uid"。

3.5、關於檔案所屬使用者組的test
"-group gname":表示屬於"gname"這個使用者組的檔案,"gname"可以是"使用者組名稱",也可以是"使用者組ID,即gid"。

3.6、關於檔名稱的test
"-name pattern":檔名符合"pattern"這個正規表示式的檔案。

四、其他
"find"命令的完整定義:
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]

但是在使用"find"命令的時候,一般不解析遇到的軟符號連結檔案,如果解析的話很容易造成遞迴死迴圈,而我們一般也不使用除錯和優化選項,
因此"-H","-L","-P","-D","-O"這些選項一般不常用。 

"expression"中包括了"options","tests","actions",以及它們之間的"operators"這四個部分。但是"options"一般也沒有什麼用,除了
"-maxdepth"這個"option"],"actions"也比較複雜,因而我們可以選擇先使用簡單的"find"命令,找出符合條件的檔案,然後再通過管道或者
指令碼的方式進行操作。 因此,最終"-H","-L","-P","-D","-O","expression"中的"options","actions","operators"都不需要。

ln命令:建立符號連結檔案

常用用法:ln [-s] TARGET LINK_NAME
含義:
有-s選項,表示建立到TARGET的軟符號連結檔案,軟符號連結檔案的檔名為LINK_NAME
沒有-s選項,表示建立到TARGET的硬符號連結檔案,硬符號連結檔案的檔名為LINK_NAME

注意:當一個區分比如/分割槽空間快爆滿時,可以將這個分割槽下的大檔案先mv到別的大分割槽下(比如home區分),然後再將這個大檔案從home分割槽軟連結回到/分割槽下

mount命令

格式:mount [-引數] [裝置名稱] [掛載點] 

其中常用的引數有:
-a    安裝在/etc/fstab檔案中類出的所有檔案系統。
-f     偽裝mount,作出檢查裝置和目錄的樣子,但並不真正掛載檔案系統。
-n    不把安裝記錄在/etc/mtab 檔案中。
-r     講檔案系統安裝為只讀。
-v     詳細顯示安裝資訊。
-w    將檔案系統安裝為可寫,為命令預設情況。

-t     指定裝置的檔案系統型別,常見的有: 
ext2    linux目前常用的檔案系統 
msdos    MS-DOS的fat,就是fat16 
vfat     windows98常用的fat32 
nfs      網路檔案系統 
iso9660     CD-ROM光碟標準檔案系統 
ntfs       windows NT/2000/XP的檔案系統 
auto    自動檢測檔案系統 

-o      指定掛載檔案系統時的選項,有些也可寫到在/etc/fstab中。常用的有: 
defaults     使用所有選項的預設值(auto、nouser、rw、suid)
auto/noauto      允許/不允許以 –a選項進行安裝
dev/nodev      對/不對檔案系統上的特殊裝置進行解釋
exec/noexec      允許/不允許執行二進位制程式碼
suid/nosuid     確認/不確認suid和sgid位
user /nouser    允許/不允許一般使用者掛載
codepage=XXX    內碼表 
iocharset=XXX     字符集 
ro     以只讀方式掛載 
rw     以讀寫方式掛載 
remount     重新安裝已經安裝了的檔案系統
loop     掛載迴旋裝置

需要注意:
掛載點必須是一個已經存在的目錄,這個目錄可以不為空,但掛載後這個目錄下以前的內容將不可用,umount以後會恢復正常。

使用多個引數的時候,-o只用一次,引數之間用半形逗號隔開:
[root@redis-new01 ~]# mount –o remount,rw /

例如要掛載windows下檔案系統為FAT32的D盤,一般而言在Linux下這個分割槽對應/dev/hda5,根據具體的分割槽情況會有不同,
這裡就以hda5來舉例說明:
[root@redis-new01 ~]# mkdir /mnt/hda5  //建立hda5的目錄作為掛載點,位置和目錄名可自定義//
[root@redis-new01 ~]# mount -t vfat /dev/hda5 /mnt/hda5

一般而言,Linux會自動探測分割槽的檔案系統,除非讓你指定時,否則-t vfat 可以省掉。
[root@redis-new01 ~]# mount /dev/hda5 /mnt/hda5
這樣就可以進入/mnt/hda5目錄去訪問分割槽中的資源了。 

=====為什麼mount上分割槽後顯示不了中文檔案為問號/亂碼?=====
顯示問號表明你的系統中沒有可識別使用的中文字型,請先安裝中文字型。確保你的系統已經可以很好的顯示中文。顯示為亂碼一般是mount預設
使用的檔案系統編碼和檔案系統中檔案的實際編碼不一致造成的。要想正常顯示中文檔案,mount時需要用到 -o 引數裡的codepage和iocharset
選項。codepage指定檔案系統的內碼表,簡體中文中文程式碼是936;iocharset指定字符集,簡體中文一般用cp936或gb2312。
[root@redis-new01 ~]# mount –o iocharset=gb2312 codepage=936 /dev/hda5 /mnt/hda5

一般來說 mount –o iocharset=cp936 /dev/hda5 /mnt/hda5 就可以解決問題了。
如果這樣做了以後還有問題,請嘗試UTF-8編碼:
[root@redis-new01 ~]# mount –o iocharset=utf8 /dev/hda5 /mnt/hda5

=====為什麼mount上去以後分割槽普通使用者不可寫?=====
mount時加上 –o umask=000 即可:
[root@redis-new01 ~]# mount –o umask=000, iocharset=cp936 /dev/hda5 /mnt/hda5

=====為什麼mount上去後的分割槽中的檔案都變成短檔名了?=====
這是檔案系統掛錯的原因,將FAT32掛載成FAT16時就會出現這種情況,先umount,然後用 –t vfat 重新掛載即可解決問題。
[root@redis-new01 ~]# mount –t vat /dev/hda5 /mnt/hda5

=====為什麼不能mount ntfs分割槽?======
這是核心不支援NTFS檔案系統的原因,請重新編譯核心或者安裝核心的NTFS檔案系統支援包,以使得核心有NTFS檔案系統的支援。

=====如何掛載U盤和mp3?=====
如果計算機沒有其它SCSI裝置和usb外設的情況下,插入的U盤的裝置路徑是 /dev/sda1,用命令:
[root@redis-new01 ~]# mkdir /mnt/u
[root@redis-new01 ~]# mount /dev/sda1 /mnt/u
掛載即可。

=====可以直接使用iso檔案嗎?=====
可以,就是mount的這一選項使得Linux下有免費虛擬光碟機的說法,具體用法是:
[root@redis-new01 ~]# mkdir /mnt/iso 
[root@redis-new01 ~]# mount –o loop linux.iso /mnt/iso
當然,掛載以後掛載點/mnt/iso也是隻讀的。  

=====怎麼不可以mount iso檔案?=====
一般而言,大多數的發行版使用的核心均已將loop裝置的支援編譯進去了,但是也有沒有的情況,所以請確保系統所使用的核心支援loop裝置。
第二種情況是iso檔案被放置到了NTFS或其它只讀檔案系統中了。掛載loop 裝置必須要求掛載到一個可寫的分割槽中,目前Linux核心對NTFS
檔案系統的寫支援非常有限,請將iso檔案複製到其它可寫檔案系統中後再掛載。

=====如何掛載光碟機和軟碟機=====
一般來說CDROM的裝置檔案是/dev/hdc,軟碟機的裝置名是/dev/fd0
[root@redis-new01 ~]# mkdir /mnt/cdrom 
[root@redis-new01 ~]# mount /dev/hdc /mnt/cdrom //掛載光碟機 //
[root@redis-new01 ~]# mkdir /mnt/floppy  
[root@redis-new01 ~]# mount /dev/fd0 /mnt/floppy   //掛載軟碟機 //

=====為何掛載的CD-ROM不能顯示中文檔案?=====
使用 –o iocharset=cp936 選項一般能解決問題,否則使用utf-8編碼。
[root@redis-new01 ~]# mount –o iocharset=cp936 /dev/hdc /mnt/cdrom

=====如何開機自動掛載分割槽?=====
每次掛載都要輸入那麼長的命令的確是繁瑣了些,只要將分割槽資訊寫到/etc/fstab檔案中即可實現系統啟動的自動掛載,例如對於/dev/hda5的自動掛載新增如下的行即可:
/dev/hda5 /mnt/hda5 vfat defaults,iocharset=cp936, rw 0 0

===== 如何掛載samba 分割槽?=====
[root@redis-new01 ~]# mkdir /mnt/share
[root@redis-new01 ~]# mount -t smbfs -o username=root,password=abc,codepage=936,iocharset=gb2312//192.168.1.100/share  /mnt/share
如果中文顯示不正常請嘗試UTF-8編碼。當然可以寫到fstab中實現自動掛載。

=====mount --bind是什麼意思?=====
mount --bind 是將一個目錄中的內容掛載到另一個目錄上,用法是
[root@redis-new01 ~]# mount --bind olddir newdir

該命令使得自己搭建的FTP要共享某個目錄的時候變得特別方便。如果要取消mount用命令:
[root@redis-new01 ~]# mount --move olddir newdir 即可。

如果mount --bind 也想寫入fstab中的話格式如下:
olddir newdir none bind 0 0

=====umount基本用法是?=====
譬如 /dev/hda5 已經掛載在/mnt/hda5上,用一下三條命令均可解除安裝掛載的檔案系統
[root@redis-new01 ~]# umount /dev/hda5
[root@redis-new01 ~]# umount /mnt/hda5
[root@redis-new01 ~]# umount /dev/hda5 /mnt/hda5

=====為什麼umount的時候老顯示 device busy?=====
這是因為有程式正在訪問這個裝置,最簡單的辦法就是讓訪問該裝置的程式退出以後再umount。
可能有時候使用者搞不清除究竟是什麼程式在訪問裝置,如果使用者不急著umount,則可以用:
[root@redis-new01 ~]# umount -l /mnt/hda5
來解除安裝裝置。選項 –l 並不是馬上umount,而是在該目錄空閒後再umount。
還可以先用命令 ps aux 來檢視佔用裝置的程式PID,然後用命令kill來殺死佔用裝置的程式,這樣就umount的非常放心了。

方法一:
# fuser -m -v /nfs_old/
/nfs_old/:   root  2699    ..c..  bash
                  root  2999    ..c..  su

如上所示,有兩個程式佔用了,將其kill掉,再重新取消掛載。
# kill -9 2699 2999
# umount /nfs_old/

方法二:
# umount  -l  /nfs_old/

方法三:
# fuser -km /nfs_old/

=========================案例說明=========================
在做專案時,客戶需要FTP同時訪問兩個目錄,即實現一個ftp賬號同時訪問兩個目錄。要清楚,在建FTP時,都是一個使用者對應一個目錄,
當FTP使用者登入後,就只訪問當前目錄。但如果需要訪問到其他目錄,這個該如何解決呢?

剛開始以為使用連結可以實現這個功能,但是發現連結成功了,但是使用ftp是不可以訪問的,不成功。
最終解決方法:使用mount的方法,把目錄掛到,原來的目錄中。

例如:
使用者test要同時訪問到目錄/data1、/data2
在test使用者家目錄下新建兩個目錄test1、test2
然把把/data1、/data2掛到對應的test1、test2
[root@huanqiu ~][root@redis-new01 ~]# mkdir /home/test/{test1,test2}
[root@huanqiu ~][root@redis-new01 ~]# mount --bind /data1 /home/test/test1
[root@huanqiu ~][root@redis-new01 ~]# mount --bind /data2 /home/test/test2

這樣就可以使用test賬號登陸ftp後,同時訪問到/data1、/data2目錄了。

mkdir命令:建立目錄

常用用法:
含義:建立目錄;
如果是建立層次目錄結構(即建立連級目錄),就加上-p引數。
例如:
mkdir test1 test2 ...
mkdir -p test/test1/test2/test3
mkdir test/test{1,2,3,4,5}

tar命令:打包

解壓
語法:tar [主選項+輔選項] 檔案或者目錄
使用該命令時,主選項是必須要有的,它告訴tar要做什麼事情,輔選項是輔助使用的,可以選用。
 
主選項:
c 建立新的檔案檔案。如果使用者想備份一個目錄或是一些檔案,就要選擇這個選項。相當於打包。
x 從檔案檔案中釋放檔案。相當於拆包。
t 列出檔案檔案的內容,檢視已經備份了哪些檔案。
 
特別注意,在引數的下達中, c/x/t 僅能存在一個!不可同時存在!因為不可能同時壓縮與解壓縮。
 
輔助選項:
-z :是否同時具有 gzip 的屬性?亦即是否需要用 gzip 壓縮或解壓? 一般格式為xx.tar.gz或xx. tgz
-j :是否同時具有 bzip2 的屬性?亦即是否需要用 bzip2 壓縮或解壓?一般格式為xx.tar.bz2 
-v :壓縮的過程中顯示檔案!這個常用
-f :使用檔名,請留意,在 f 之後要立即接檔名喔!不要再加其他引數!
-p :使用原檔案的原來屬性(屬性不會依據使用者而變)
--exclude FILE:在壓縮的過程中,不要將 FILE 打包!
--remove-files:打包後將原始檔刪除
 
常常使用的結構:
tar
tar.gz
tar.bz2
 
比如將檔案file1打包上上面三種格式,分別是:
tar -vcf file.tar file     #將檔案file打包成tar格式,打包引數-c
tar -vxf file.tar -C /mnt  #將file.tar包解壓到目標目錄/mnt上,解包引數-x,-C是解壓到哪個目標目錄下
 
tar -zvcf file.tar.gz file
tar -zvxf file.tar.gz -C /mnt
 
tar -jvcf file.tar.bz2 file
tar -jvxf file.tar.bz2 -C /mnt
 
示例一:
[root@localhost ~]# ll /mnt/kevin.txt
-rw-r--r--. 1 root root 0 Jun  8 03:03 /mnt/kevin.txt
[root@localhost ~]# tar -zvcf /opt/kevin-`date +%Y%m%d`.tar.gz /mnt/kevin.txt --remove-files
tar: Removing leading `/' from member names
/mnt/kevin.txt
[root@localhost ~]# ll /opt/
-rw-r--r--.  1 root root   118 Jun  8 03:03 kevin-20180608.tar.gz
[root@localhost ~]# ll /mnt/kevin.txt
ls: cannot access /mnt/kevin.txt: No such file or directory

示例二:將整個 /etc 目錄下的檔案全部打包成為 /tmp/etc.tar
[root@linux ~]# tar -cvf /tmp/etc.tar /etc    <==僅打包,不壓縮!
[root@linux ~]# tar -zcvf /tmp/etc.tar.gz /etc  <==打包後,以 gzip 壓縮
[root@linux ~]# tar -jcvf /tmp/etc.tar.bz2 /etc  <==打包後,以 bzip2 壓縮
 
特別注意:
在引數 f 之後的檔案檔名是自己取的,我們習慣上都用 .tar 來作為辨識。
如果加 z 引數,則以 .tar.gz 或 .tgz 來代表 gzip 壓縮過的 tar file ~
如果加 j 引數,則以 .tar.bz2 來作為附檔名啊~
上述指令在執行的時候,會顯示一個警告訊息:
 
tar: Removing leading `/" from member names       這是關於絕對路徑的特殊設定。
 
示例三:查閱上述 /tmp/etc.tar.gz 檔案內有哪些檔案?
[root@linux ~]# tar -ztvf /tmp/etc.tar.gz
由於我們使用 gzip 壓縮,所以要查閱該 tar file 內的檔案時,
就得要加上 z 這個引數了!這很重要的!
 

示例四:將 /tmp/etc.tar.gz 檔案解壓縮在 /usr/local/src 底下
[root@linux ~]# cd /usr/local/src
[root@linux src]# tar -zxvf /tmp/etc.tar.gz
在預設的情況下,我們可以將壓縮檔在任何地方解開的!以這個示例來說
我先將工作目錄變換到 /usr/local/src 底下,並且解開 /tmp/etc.tar.gz
則解開的目錄會在 /usr/local/src/etc ,另外,如果您進入 /usr/local/src/etc
則會發現,該目錄下的檔案屬性與 /etc/ 可能會有所不同喔!
 
示例五:在 /tmp 底下,我只想要將 /tmp/etc.tar.gz 內的 etc/passwd 解開而已
[root@linux ~]# cd /tmp
[root@linux tmp]# tar -zxvf /tmp/etc.tar.gz etc/passwd
我可以透過 tar -ztvf 來查閱 tarfile 內的檔名稱,如果單隻要一個檔案,
就可以透過這個方式來下達!注意到! etc.tar.gz 內的根目錄 / 是被拿掉了!
 
示例六:我要備份 /home, /etc ,但不要 /home/dmtsai
[root@linux ~]# tar --exclude /home/dmtsai -zcvf myfile.tar.gz /home/* /etc
 
另外:tar命令的C引數
[root@linux ~]# tar -cvf file2.tar /home/usr2/file2
tar: Removing leading '/' from members names
home/usr2/file2
該命令可以將/home/usr2/file2檔案打包到當前目錄下的file2.tar中,

需要注意的是:使用絕對路徑標識的原始檔,在用tar命令壓縮後,檔名連同絕對路徑(這裡是home/usr2/,根目錄'/'被自動去掉了)一併被壓縮排來。使用tar命令解壓縮後會出現以下情況:
 
[root@linux ~]# tar -xvf file2.tar
[root@linux ~]# ls
…… …… home …… ……
解壓縮後的檔名不是想象中的file2,而是home/usr2/file2。
 
[root@linux ~]# tar -cvf file2.tar -C /home/usr2 file2
該命令中的-C dir引數,將tar的工作目錄從當前目錄改為/home/usr2,將file2檔案(不帶絕對路徑)壓縮到file2.tar中。

注意:-C dir引數的作用在於改變工作目錄,其有效期為該命令中下一次-C dir引數之前。

使用tar的-C dir引數,同樣可以做到在當前目錄/home/usr1下將檔案解壓縮到其他目錄,
例如:
[root@linux ~]# tar -xvf file2.tar -C /home/usr2
而tar不用-C dir引數時是無法做到的:
 
[root@linux ~]# tar -xvf file2.tar /home/usr2
tar: /tmp/file: Not found in archive
tar: Error exit delayed from previous errors

unrar命令:解壓RAR檔案

一、常用用法
unrar x "rar檔名"

二、含義與選項
2.1、含義
解壓rar檔案到當前目錄,並儲存原壓縮檔案目錄結構。

2.2、選項
“x”:解壓時儲存原壓縮檔案目錄結構

示例:
檢視rar包中的內容:
[root@redis-new01 ~]# unrar l *.rar
或者
[root@redis-new01 ~]# unrar v *.rar

測試rar包是否能解壓成功:
[root@redis-new01 ~]# unrar t *.rar

解壓到當前資料夾:
[root@redis-new01 ~]# unrar e *.rar

解壓到指定資料夾:
[root@redis-new01 ~]# unrar x *.rar /tmp

===========================================================
zip命令用來壓縮檔案。gzip是個使用廣泛的壓縮程式,檔案經它壓縮過後,其名稱後面會多處“.gz”副檔名。
1)用法:
gzip [選項引數][-s <壓縮字尾字串>]   [檔案...]
或 gzip [選項引數][-s <壓縮字尾字串>]   [目錄]

2)功能:
gzip是個使用廣泛的解壓縮程式,它用於解開被gzip壓縮過的檔案,這些壓縮檔案預設最後的副檔名為".gz"。
事實上gzip就是gzip的硬連線,因此不論是壓縮或解壓縮,都可通過gzip指令單獨完成。

3)選項引數:
-d --decompress --uncompress                  解開壓縮檔案;
-v --verbose                         顯示指令執行過程;
-l  --list                          列出壓縮檔案的相關資訊;
-r --recursive                        遞迴處理,將指定目錄下的所有檔案及子目錄一併處理;
-A --catenate:                       新增檔案到已存在的備份檔案; 
-B                              設定區塊大小
 -c                              把解壓後的檔案輸出到標準輸出裝置

示例一
[root@redis-new01 ~]#   gzip *
[root@redis-new01 ~]#   ll
總用量 12
-r-xr-xr-x. 1 sunjimeng root      411 5月   9 07:59 head_text.gz
-r-xr-xr-x. 1 root      sunjimeng  67 5月   9 08:15 less1.gz
-r-xr-xr-x. 1 root      sunjimeng  80 5月   9 08:16 less2.gz

示例二
[root@redis-new01 ~]#   gzip -d *            //解壓當前目錄的所有檔案
[root@redis-new01 ~]#   gzip *                //解壓並不能像壓縮時那樣什麼引數都不帶,需要帶解壓命令-d
gzip: head_text.gz already has .gz suffix -- unchanged
gzip: less1.gz already has .gz suffix -- unchanged
gzip: less2.gz already has .gz suffix -- unchanged
[root@redis-new01 ~]#   gzip -d *
[root@redis-new01 ~]#   ll
總用量 12
-r-xr-xr-x. 1 sunjimeng root      664 5月   9 07:59 head_text
-r-xr-xr-x. 1 root      sunjimeng  45 5月   9 08:15 less1
-r-xr-xr-x. 1 root      sunjimeng  57 5月   9 08:16 less2

示例三
[root@redis-new01 ~]#   gzip -v *
head_text:     42.3% -- replaced with head_text.gz
less1:      4.4% -- replaced with less1.gz
less2:      1.8% -- replaced with less2.gz
[root@redis-new01 ~]#   gzip -dv *
head_text.gz:     42.3% -- replaced with head_text
less1.gz:      4.4% -- replaced with less1
less2.gz:      1.8% -- replaced with less2

示例四
[root@redis-new01 ~]#   gzip -l *
[root@redis-new01 ~]#   gzip -l *
compressed        uncompressed  ratio uncompressed_name
411               664           42.3% head_text
67                45            4.4%  less1
80                57            1.8%  less2
558               766           30.3% (totals)
[root@redis-new01 ~]#   ll
總用量 12
-r-xr-xr-x. 1 sunjimeng root      411 5月   9 07:59 head_text.gz
-r-xr-xr-x. 1 root      sunjimeng  67 5月   9 08:15 less1.gz
-r-xr-xr-x. 1 root      sunjimeng  80 5月   9 08:16 less2.gz

示例五
[root@redis-new01 ~]#   tar -cvf Dir.tar Dir
Dir/
Dir/head_text.gz
Dir/less1.gz
Dir/less2.gz
[root@redis-new01 ~]#   ll
總用量 12
dr-xr-xr-x. 2 root sunjimeng    55 5月  24 07:28 Dir
-rw-r--r--. 1 root root      10240 5月  24 07:34 Dir.tar
[root@redis-new01 ~]#   gzip -v Dir.tar
Dir.tar:     92.1% -- replaced with Dir.tar.gz
[root@redis-new01 ~]#   gzip -l Dir.tar.gz
compressed        uncompressed  ratio uncompressed_name
833               10240         92.1% Dir.tar

示例六
[root@redis-new01 ~]#   tar cvf Dir1.tar -R Dir
塊 0:Dir/
塊 1:Dir/head_text.gz
塊 3:Dir/less1.gz
塊 5:Dir/less2.gz
[root@redis-new01 ~]#   tar -cvf Dir2.tar Dir
Dir/
Dir/head_text.gz
Dir/less1.gz
Dir/less2.gz
[root@redis-new01 ~]#   tar -cvf Dir3.tar -R Dir
塊 0:Dir/
塊 1:Dir/head_text.gz
塊 3:Dir/less1.gz
塊 5:Dir/less2.gz

示例七
[root@redis-new01 ~]#   gzip -vr findDir      //遞迴的壓縮子資料夾下的檔案
gzip: findDir/Dir/head_text.gz already has .gz suffix -- unchanged
gzip: findDir/Dir/less1.gz already has .gz suffix -- unchanged
gzip: findDir/Dir/less2.gz already has .gz suffix -- unchanged
gzip: findDir/Dir.tar.gz already has .gz suffix -- unchanged
findDir/Dir1.tar:     92.1% -- replaced with findDir/Dir1.tar.gz
findDir/Dir2.tar:     92.1% -- replaced with findDir/Dir2.tar.gz
findDir/Dir3.tar:     92.1% -- replaced with findDir/Dir3.tar.gz
[root@redis-new01 ~]#   ls -l findDir
總用量 16
-rw-r--r--. 1 root root      833 5月  24 07:34 Dir.tar.gz
-rw-r--r--. 1 root root      834 5月  24 07:43 Dir3.tar.gz
-rw-r--r--. 1 root root      834 5月  24 07:39 Dir2.tar.gz
-rw-r--r--. 1 root root      834 5月  24 07:39 Dir1.tar.gz
dr-xr-xr-x. 2 root sunjimeng  55 5月  24 07:28 Dir
[root@redis-new01 ~]#   ls -l findDir/Dir
總用量 12
-r-xr-xr-x. 1 root      sunjimeng  80 5月   9 08:16 less2.gz
-r-xr-xr-x. 1 root      sunjimeng  67 5月   9 08:15 less1.gz
-r-xr-xr-x. 1 sunjimeng root      411 5月   9 07:59 head_text.gz

示例八
[root@redis-new01 ~]#   gzip -rdv Dir        //遞迴的解壓目錄下的所有.gz的檔案
[root@redis-new01 ~]#   ls -l Dir
總用量 12
-r-xr-xr-x. 1 sunjimeng root      411 5月   9 07:59 head_text.gz
-r-xr-xr-x. 1 root      sunjimeng  67 5月   9 08:15 less1.gz
-r-xr-xr-x. 1 root      sunjimeng  80 5月   9 08:16 less2.gz
[root@redis-new01 ~]#   gzip -rdv Dir
Dir/head_text.gz:     42.3% -- replaced with Dir/head_text
Dir/less1.gz:      4.4% -- replaced with Dir/less1
Dir/less2.gz:      1.8% -- replaced with Dir/less2
[root@redis-new01 ~]#   ls -l Dir
總用量 12
-r-xr-xr-x. 1 sunjimeng root      664 5月   9 07:59 head_text
-r-xr-xr-x. 1 root      sunjimeng  45 5月   9 08:15 less1
-r-xr-xr-x. 1 root      sunjimeng  57 5月   9 08:16 less2
[root@redis-new01 ~]#   gzip -r Dir
[root@redis-new01 ~]#   ls -l Dir
總用量 12
-r-xr-xr-x. 1 sunjimeng root      411 5月   9 07:59 head_text.gz
-r-xr-xr-x. 1 root      sunjimeng  67 5月   9 08:15 less1.gz
-r-xr-xr-x. 1 root      sunjimeng  80 5月   9 08:16 less2.gz
[root@redis-new01 ~]#   gzip -dv Dir
gzip: Dir is a directory -- ignored

zip/unzip

命令名:zip
功能說明:壓縮檔案。
語  法:zip [-AcdDfFghjJKlLmoqrSTuvVwXyz$][-b <工 作目錄>][-ll][-n <字 尾字串>][-t <日 期時間>][-<壓 縮效率>][壓 縮檔案][檔案...][-i <範本樣式>][-x <範本樣式>]
補充說明:zip是個使用廣泛的壓縮程式,檔案經它壓縮後會另外產生具 有".zip"副檔名 的壓縮檔案。
 
參  數:
-A   調 整可執行的自動解壓縮檔案。
-b<工作目錄>   指 定暫時存放檔案的目錄。
-c   替 每個被壓縮的檔案加上註釋。
-d   從 壓縮檔案內刪除指定的檔案。
-D   壓 縮檔案內不建立目錄名稱。
-f   此 引數的效果和指定"-u"參 數類似,但不僅更新既有檔案,如果某些檔案原本不存在於壓縮檔案內,使用本引數會一併將其加入壓縮檔案中。
-F   嘗 試修復已損壞的壓縮檔案。
-g   將 檔案壓縮後附加在既有的壓縮檔案之後,而非另行建立新的壓縮檔案。
-h   在 線幫助。
-i<範本樣式>   只 壓縮符合條件的檔案。
-j   只 儲存檔名稱及其內容,而不存放任何目錄名稱。
-J   刪 除壓縮檔案前面不必要的資料。
-k   使 用MS-DOS相容格 式的檔名稱。
-l   壓 縮檔案時,把LF字元 置換成LF+CR字 符。
-ll   壓 縮檔案時,把LF+CR字 符置換成LF字元。
-L   顯 示版權資訊。
-m   將 檔案壓縮並加入壓縮檔案後,刪除原始檔案,即把檔案移到壓縮檔案中。
-n<字尾字串>   不 壓縮具有特定字尾字串的檔案。
-o   以 壓縮檔案內擁有最新更改時間的檔案為準,將壓縮檔案的更改時間設成和該檔案相同。
-q   不顯 示指令執行過程。
-r   遞 歸處理,將指定目錄下的所有檔案和子目錄一併處理。
-S   包 含系統和隱藏檔案。
-t<日期時間>   把 壓縮檔案的日期設成指定的日期。
-T   檢 查備份檔案內的每個檔案是否正確無誤。
-u   更 換較新的檔案到壓縮檔案內。
-v   顯 示指令執行過程或顯示版本資訊。
-V   保 存VMS作業系統的文 件屬性。
-w   在 檔名稱裡假如版本編號,本引數僅在VMS操 作系統下有效。
-x<範本樣式>   壓 縮時排除符合條件的檔案。
-X   不 儲存額外的檔案屬性。
-y   直 接儲存符號連線,而非該連線所指向的檔案,本引數僅在UNIX之 類的系統下有效。
-z   替 壓縮檔案加上註釋。
-$   保 存第一個被壓縮檔案所在磁碟的卷冊名稱。
-<壓縮效率>   壓 縮效率是一個介於1-9的 數值。
 
示例1: 壓縮test.MYI
[root@mysql test]# zip test1.zip test.MYI
adding: test.MYI (deflated 42%)
 
[root@mysql test]#ll
-rw-r--r-- 1 root    root    1033755 09-24 10:03 test1.zip
 
壓縮率為8的
[root@mysql test]# zip test2.zip -8 test.MYI
adding: test.MYI (deflated 42%)
 
[root@mysql test]#ll
-rw-r--r-- 1 root    root    1033451 09-24 10:03 test2.zip
 
示例2: 將當前目錄下的所有檔案和資料夾全部壓縮成test.zip檔案,-r表示遞迴壓縮子目錄下所有檔案
[root@mysql test]# zip -r test.zip ./*
 
打包目錄
[root@mysql test]# zip test2.zip test2/*
 
示例3: 刪除壓縮檔案test1.zip中test.MYI檔案
[root@mysql test]# zip -d test1.zip test.MYI
 
刪除打包檔案目錄下的檔案
[root@mysql test]# zip -d test2.zip test2/ln.log
deleting: tests/ln.log
 
示例4: 向壓縮檔案中test1.zip中新增test. MYI檔案
[root@mysql test]# zip -m test1.zip test. MYI
 
示例5: 壓縮檔案時排除某個檔案
[root@mysql test]# zip test3.zip tests/* -x tests/ln.log
 
=====================================================
命令名: unzip
功 能說明:解壓縮zip文 件
語  法:unzip [-cflptuvz][-agCjLMnoqsVX][-P <密 碼>][.zip文 件][檔案][-d <目錄>][-x <檔案>] 或 unzip [-Z]
補充說明:unzip為.zip壓縮檔案的解壓縮程式。
參  數:
-c   將 解壓縮的結果顯示到螢幕上,並對字元做適當的轉換。
-f   更 新現有的檔案。
-l   顯 示壓縮檔案內所包含的檔案。
-p   與-c引數類似,會將解壓縮的結果顯示到螢幕上,但不會執行任 何的轉換。
-t   檢 查壓縮檔案是否正確。,但不解壓。
-u   與-f引數類似,但是除了更新現有的檔案外,也會將壓縮檔案中 的其他檔案解壓縮到目錄中。
-v   執 行是時顯示詳細的資訊。或檢視壓縮檔案目錄,但不解壓。
-z   僅 顯示壓縮檔案的備註文字。
-a   對 文字檔案進行必要的字元轉換。
-b   不 要對文字檔案進行字元轉換。
-C   壓 縮檔案中的檔名稱區分大小寫。
-j   不 處理壓縮檔案中原有的目錄路徑。
-L   將 壓縮檔案中的全部檔名改為小寫。
-M   將 輸出結果送到more程 序處理。
-n   解 壓縮時不要覆蓋原有的檔案。
-o   不 必先詢問使用者,unzip執 行後覆蓋原有檔案。
-P<密碼>   使 用zip的密碼選項。
-q   執 行時不顯示任何資訊。
-s   將 檔名中的空白字元轉換為底線字元。
-V   保 留VMS的檔案版本信 息。
-X   解 壓縮時同時回存檔案原來的UID/GID。
 
[.zip檔案]   指定.zip壓縮檔案。
[檔案]   指定 要處理.zip壓縮文 件中的哪些檔案。
-d<目錄>   指 定檔案解壓縮後所要儲存的目錄。
-x<檔案>   指 定不要處理.zip壓 縮檔案中的哪些檔案。
-Z   unzip -Z等 於執行zipinfo指 令。
 
示例1:將壓縮檔案text.zip在當前目錄下解壓縮。
[root@mysql test]# unzip test.zip
 
示例2:將壓縮檔案text.zip在指定目錄/tmp下解壓縮,如果已有相同的檔案存在,要求unzip命令不覆蓋原先的檔案。
[root@mysql test]# unzip -n test.zip -d /tmp
 
示例3:檢視壓縮檔案目錄,但不解壓。
[root@mysql test]# unzip -v test.zip
 
示例4:將壓縮檔案test.zip在指定目錄tmp下解壓縮,如果已有相同的檔案存在,要求unzip命令覆蓋原先的檔案。
[root@mysql test]# unzip -o test.zip -d tmp/

pwd命令:列印當前目錄

常用用法:pwd [-P]
含義:
列印當前目錄
不含"-P"選項,表示列印當前目錄,如果目錄路徑中包含連結檔案,不進行解析
含有"-P"選項,表示列印當前目錄,如果目錄路徑中包含連結檔案,則進行解析

#echo $PWD   列印當前所在路徑

umask命令:檔案預設許可權

常用用法:umask [mask]
含義:
1、沒有"mask"引數,表示列印當前的mask設定值
2、有"mask"引數,表示設定當前的mask值為"mask"
3、mask值的用途
mask值表示建立檔案時預設需要減去的許可權
建立一般檔案時,預設的許可權是"0666-mask",即0666減去umask碼值
建立目錄時,預設的許可權是"0777-mask",即0777減去umask碼值
注意,以上的相減操作不能通過數字形式直接相減,這會產生錯誤,需要通過對應的rwx形式進行操作
比如"0666-0003"
數字直接相減結果是:0663
正確的方式是:"rw-rw-rw-"減去"-------wx",結果為"rw-rw-r--"
4、mask設定值是跟當前的shell環境相關聯的設定

which命令:在$PATH變數指定的路徑中查詢檔案

常用用法:which -a filename
含義:
在$PATH變數指定的路徑中查詢所有檔名為filename的檔案,並將所有找到的檔案的路徑列印出來

備註:
1)需要全部匹配,而不能是部分匹配
比如
“which ps”的結果是"/bin/ps"
"which p"的結果是空白,"/bin/ps"不是合法結果
2)需要匹配檔名,與路徑中的目錄名匹配不符合要求
比如
"which bin"的結果是空白,"/bin/ps"不是合法結果

whereis命令:在標準的Linux下的幾個目錄中查詢檔案相關聯的原始碼,幫助文件,二進位制檔案

常用用法:whereis filename
含義:基於"/var/lib/mlocate/mlocate.db"資料庫,在標準的Linux下的幾個目錄中查詢filename相關聯的原始碼,幫助文件,二進位制檔案
比如"whereis man",匹配到的幫助文件為"/usr/share/man/man7/man.7.gz /usr/share/man/man1/man.1.gz",匹配到的二進位制檔案為"/usr/bin/man /usr/bin/X11/man /usr/local/man /usr/share/man"
比如"whereis kernel",匹配到的原始碼"/usr/src/linux-headers-3.16.0-30/kernel /usr/src/linux-headers-3.16.0-30-generic/kernel"

備註:
1)由於是在標準的幾個目錄中查詢,因而擴充套件性不強
2)通過整體匹配,而不是部分匹配
"whereis ma"不能匹配到"/usr/bin/man"
3)匹配檔名,而不是匹配路徑中的目錄名
"whereis bin"不能匹配到"/bin/ps"

locate命令:基於“/var/lib/mlocate/mlocate.db”這個資料庫查詢檔案

常用用法:locate [-i] PATTERN
含義:
1)查詢包含"PATTERN"的檔案路徑
2)整個查詢過程基於"/var/lib/mlocate/mlocate.db"這個資料庫
3)系統每天更新一次"/var/lib/mlocate/mlocate.db"資料庫
4)可以通過"updatedb"命令手動更新"/var/lib/mlocate/mlocate.db"資料庫

file命令:列印推測得到的檔案型別

常用用法:file -i filename 
含義: 
列印filename指代的檔案的型別和編碼格式,沒有命令能夠確切知道某個檔案的編碼格式,只能是推測,因此得到的最終檔案編碼格式不一定是正確的 
-i選項:以“mime type”形式列印檔案型別和編碼格式

stat命令:列印檔案資訊

常用用法:stat 檔案路徑
含義:列印檔案的一些詳細資訊
比如現在有一個"readme"檔案,執行"stat readme"命令,可得如圖1所示結果。有一個"Desktop"目錄,執行"stat Desktop"命令,可得

[root@huanqiu ~]# stat web.xml 
  File: `web.xml'
  Size: 2438        Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 2764173     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2016-09-08 17:25:51.994707928 +0800
Modify: 2016-09-08 17:25:48.595682668 +0800
Change: 2016-09-08 17:25:48.595682668 +0800

[root@huanqiu ~]# stat sudoers/
  File: `sudoers/'
  Size: 4096        Blocks: 8          IO Block: 4096   directory
Device: fd00h/64768d    Inode: 2817544     Links: 2
Access: (0700/drwx------)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2016-10-20 15:05:06.551702069 +0800
Modify: 2016-01-21 18:35:44.286016733 +0800
Change: 2016-01-21 18:35:44.286016733 +0800

輸出資訊中屬性的解釋如下:
File:檔名稱
Size:檔案的大小,這個大小是檔案的使用大小(關於檔案的“使用大小”和“佔用大小”可見《Ext檔案系統中,檔案的“佔用大小”和“使用大小”》)。注意,如果是目錄檔案,該屬性值並沒有累加統計該目錄檔案下的子檔案的使用大小
Blocks:這個Blocks不是指"inode/block"體系中的block數量。其實指的是某種容量單元的數量。不過可以通過公式“Blocks*單個該種容量單元所含位元組數/一個block節點所含位元組數”換算得到需要的block節點數量,其中單個該種容量單元所含位元組數,可通過"stat --format=%B readme"獲得。假如單個該種容量單元的含有位元組數為512B,一個block節點含有位元組數為4096B,現在Blocks=8,那麼block節點數量=1。注意,這個屬性極易混淆
IO Block:optimal I/O transfer size hint
"regular file":該值表示檔案型別
Device:裝置號
Inode:Inode節點號
Links:檔案的硬連結計數
Access:檔案讀取執行許可權相關資訊
Uid:檔案所屬使用者的資訊
Gid:檔案所屬組的資訊
Access:atime
Modify:mtime
Change:ctime
Birth:檔案建立時間,一般情況下不存在該屬性值

basename命令:去除路徑字首和字尾

常用用法:basename NAME [SUFFIX]
含義:
給定一個檔名路徑,除去前導的目錄名,如果指定了SUFFIX,那麼也除去SUFFIX指定的字尾,把最終結果列印出來
比如
basename include/stdio.h .h
除去前導的目錄名"include/",得到stdio.h
指定SUFFIX=.h,那麼除去.h字尾,最後得到stdio
列印stdio

dirname命令:獲取路徑的目錄部分

常用用法:dirname NAME
含義:
給定一個檔名路徑,除去最後一部分名稱內容,接著除去冗餘的後導"/",列印最終結果;
如果檔名路徑中不包含"/",那麼最後列印"."
 
--------------------------------------------------------------------------------------------------
擴充套件小提示:
 
擷取目錄的方法,有以下兩種:
1)dirname命令:用於取給定路徑的目錄部分。這個命令很少直接在shell命令列中使用,一般把它用在shell指令碼中,用於取得指令碼檔案所在目錄,
然後將當前目錄切換過去。
其實就是取所給路徑的倒數第二級及其之前的路徑部分,如下:
[root@jenkins-server Shell]# dirname main/protected/xqsjmob/themes/tpl2/common/page_statistics.tpl
main/protected/xqsjmob/themes/tpl2/common
[root@jenkins-server Shell]# dirname /usr/local/tomcat7/webapps/jenkins/scripts/Shell
/usr/local/tomcat7/webapps/jenkins/scripts
[root@jenkins-server Shell]# dirname FF_Online.sh            #取的結果既是當前路徑目錄下
.
 
2)可以用${pathname%/*}擷取掉pathname後面的檔案部分。
下面比較下這兩種方法的效果:即dirname取的是倒數第二級及其以上級的路徑,而${pathname%/*}取的是"刪除最後一個/符號後的路徑部分"
[root@jenkins-server Shell]# pathname=/usr/bin/sort; echo $(dirname $pathname) ${pathname%/*}
/usr/bin /usr/bin
You have new mail in /var/spool/mail/root
[root@jenkins-server Shell]# pathname=/usr/bin/sort/; echo $(dirname $pathname) ${pathname%/*}
/usr/bin /usr/bin/sort
[root@jenkins-server Shell]# pathname=/usr/; echo $(dirname $pathname) ${pathname%/*}
/ /usr
[root@jenkins-server Shell]# pathname=/usr; echo $(dirname $pathname) ${pathname%/*}
/

du命令:檢視檔案大小

一、常用用法
du -sh [--apparent-size] 檔案路徑(檔案可以是目錄,也可以是一般檔案)
 
二、含義與選項
2.1、含義
當檔案為一般檔案時,估算該一般檔案的大小;當檔案為目錄時,估算"該目錄自身的大小+目錄下所有子檔案(遞迴進行)的大小"。
 
2.2、選項表示的意思
"-s":當du命令的操作物件是一個目錄時,不列印該目錄下子檔案的大小統計情況,只列印目錄總體的大小統計情況
"-h":以人類可讀形式展示檔案大小
"--apparent-size":當不加該選項時,"檔案大小"是指檔案的"佔用大小";當加了該選項後,"檔案大小"是指檔案的"使用大小"。
 
三、實驗
現在有一個"test1"目錄,其下有一個"test2"目錄,"test2"目錄下有一個"test3"目錄,在"test3"目錄下有一個"test4.txt"檔案,如下所示:
[root@redis-new01 ~]# ll -d test1
drwxr-xr-x 3 root root 4096 Oct 27 21:17 test1
[root@redis-new01 ~]# ls test1/
test2
[root@redis-new01 ~]# ls test1/test2/
test3
[root@redis-new01 ~]# ls test1/test2/test3/
test4.txt

"test1"目錄對應1個block節點(大小為4096B),"test2"目錄也對應1個block節點(大小為4096B),"test3"目錄也對應1個block節點(大小為4096B),
"test4.txt"檔案也對應1個block節點(大小為4096B),而"test4.txt"這個一般檔案對應的block節點中實際使用的空間大小為12B。
 
1)如下命令
[root@redis-new01 ~]# du -h test1
8.0K    test1/test2/test3
12K     test1/test2
16K     test1

這是因為:
16K=test1自身的4K+test2自身的4K+test3自身的4K+test4.txt的4K。

2)如下命令
[root@redis-new01 ~]# du -sh test1
16K     test1

這是因為:
16K=test1自身的4K+test2自身的4K+test3自身的4K+test4.txt的4K,並且只顯示最終的test1目錄的總體大小。

3)如下命令
[root@redis-new01 ~]# du -sh --apparent-size test1  
13K     test1

這是因為:
根據右側值向上取整得到13K=12K+12B=test1自身的4K+test2自身的4K+test3自身的4K+test4.txt的12B,並且只顯示最終的test1目錄的總體大小。

相關文章