1. 程式人生 > >檔案管理及相關命令

檔案管理及相關命令

一、檔案相關的命令

1.rz和sz命令

rz 將檔案從Windows複製至Linux中
sz 將檔案從Linux複製至Windows中
安裝這個工具:
①lsblk 檢視光碟掛載的路徑
②rpm -ivh /media/CentOS_6.9_Final/Packages/lrzsz-0.12.20-27.1.el6.x86_64.rpm
注意:無需輸入完整路徑檔名,多利用tab鍵

2.stat Display file or file system status.展示檔案或檔案系統的狀態屬性

stat [OPTION]... FILE...

==access time:訪問時間,atime,讀取檔案內容
modify time:修改時間,mtime,改變檔案內容(資料)
change time:改變時間, ctime,元資料發生改變==

3.touch 建立檔案

-a 僅改變atime和ctime
-m 僅改變mtime和ctime
-t [[CC]YY]MMDDhhmm[.ss] 指定atime和mtime的時間戳
-c 如果檔案不存在,則不予建立

4.cp 複製檔案

cp [OPTION]... [-T] SOURCE DEST
cp [OPTION]... SOURCE... DIRECTORY
cp [OPTION]... -t DIRECTORY SOURCE...

cp -a    same as -dR --preserve=all     全部複製,可用於備份檔案
cp -d    same as --no-dereference --preserve=links    不復制原始檔,只複製連結
cp -i    複製若有覆蓋別的檔案,會在覆蓋前提示(注意:$普通使用者預設不帶-i)
cp -n   do not overwrite an existing file
cp -p    等同--preserv=mode,ownership,timestamp  保留許可權、所有者、時間戳
cp -f   --force,if an existing destination file cannot be opened, remove it and try again (this option is ignored when the -n option is also used)
cp -v  顯示覆制過程
cp -u   copy only when the SOURCE file is newer than the destination file or when the destination file is missing
cp -r (-R) --recursive,copy directories recursively

在這裡插入圖片描述

==注意:==

cp /etc/hosts  /data/test/      表示將hosts檔案複製至/data/test/目錄下,前提是test目錄存在,如果不存在將會報錯!
cp /etc/hosts  /data/test       表示將hosts檔案複製至/data目錄下,並重命名為test(所以cp命令也帶改名功能),如果test檔案存在則直接覆蓋
  • 練習:
  1. 定義別名命令baketc,每天將/etc/目錄下所有檔案,備份到/testdir獨立的子目錄下,並要求子目錄格式為backupYYYY-mm-dd,備份過程可見
alias backup='cp -av /etc  /data/testdir/backup`date +%F`'
要想永久生效儲存至 .bashrc檔案
  1. 建立/testdir/rootdir目錄,並複製/root下所有檔案到該目錄內,要求保留原有許可權
cp -a  /root  /data/rootdir

5. mv 移動、重新命名檔案(move (rename) files)

mv [OPTION]... [-T] SOURCE DEST
mv [OPTION]... SOURCE... DIRECTORY
mv [OPTION]... -t DIRECTORY SOURCE...

6.rm 刪除檔案(remove files or directories)

==小技巧:
將rm 別名為mv至 /data目錄,即再執行rm命令時,自動將要刪除的檔案mv至/data檔案下
==
alias rm='mv -t /data' 更保險的操作
rm -rf 強制遞迴刪除目錄樹

7.tree 顯示目錄樹

tree -d  只顯示目錄
tree -L level :只顯示指定的層級數目
tree -P pattern:只顯示由指定patter匹配到的路徑

8.mkdir 建立目錄

mkdir -p: 存在於不報錯,且可自動建立所需的各目錄
mkdir -v: 顯示詳細資訊
mkdir -m MODE: 建立目錄時直接指定許可權

9.rename 批量改名

rename [options] expression replacement file...

rename   "conf"   "conf.bak"   file*       表示對所有file開都的檔案,其檔名中的conf全部重新命名為conf.bak

10.file 確定檔案型別

file -b 列出檔案辨識結果時,不顯示檔名稱
file -f filelist列出檔案filelist中檔名的檔案型別
file -F 使用指定分隔符號替換輸出檔名後預設的”:”分隔符
file -L 檢視對應軟連結對應檔案的檔案型別

11.神奇的小技巧

普通使用者掛載光碟:1、cd /msic/cd 2、pwd
光碟已掛載

二、檔案系統

檔案系統結構圖

1.檔案系統的一些特點

  1. 檔案和目錄形成一個倒掛的樹樁結構
  2. 檔案從跟“/”下開始
  3. 檔名稱區分大小寫
    (注意:區分大小寫非Linux系統的原因,而是檔案系統採用ext4和xfs格式的原因。從Windows複製一個fat32的檔案就不區分大小寫)
  4. 以“.”開頭的檔案時隱藏檔案,用萬用字元可以表示為.*
  5. Linux一切皆檔案,皆以檔案的形式體現
  6. 檔案有兩類資料:
  • 元資料(metadata):為描述資料的資料,主要描述資料的屬性資訊,如大小、檔名、檔案許可權、建立時間、修改時間等資訊。
  • 資料(data):
  1. Linux目錄配置的依據:FHS(Filesystem Hierarchy Standard)
    有時間可詳看:http://www.pathname.com/fhs/
  2. 檔名最長255個位元組
  3. 一般,藍色——目錄、綠色——可執行檔案,紅色——壓縮檔案、淺藍色——連結檔案,等等

2.一些主要資料夾說明

  1. /boot : 引導檔案存放目錄,核心檔案(vmlinuz)、引導載入器(bootloader, grub)都存放於此目錄
  2. /bin :供所有使用者使用的基本命令;不能關聯至獨立分割槽,OS啟動即會用到的程式
  3. /sbin:管理類的基本命令;不能關聯至獨立分割槽,OS啟動即會用到的程式,root許可權下才可以使用
  4. /lib,/lib64:庫檔案,啟動時程式依賴的基本共享庫檔案以及核心模組檔案
  5. /etc:配置檔案
  6. /root:管理員的家目錄
  7. /home:普通使用者的家目錄
  8. /media:行動式移動裝置掛載點
  9. /dev:裝置檔案及特殊檔案

    • b,block device:隨機訪問
    • c, character device:線性訪問
  10. /tmp:臨時儲存檔案
  11. /usr:擁有第二層的FHS檔案設定,universal shared, read-only data

    • /usr/bin:所有一般使用者能夠使用的指令都放在這裡!CentOS 7 已經將全部的使用者指令放置於此,而使用連結檔案的方式將 /bin 連結至此!也就是說, /usr/bin 與 /bin 是一模一樣了!
    • /usr/share:主要放置只讀架構的資料檔案,當然也包括共享檔案。在這個目錄下放置的資料幾乎是不分硬體架構均可讀取的資料。在此目錄下常見的還有這些:/usr/share/man;線上說明文件 /usr/share/doc:軟體雜項的檔案/usr/share/zoneinfo;與時區有關的時區檔案
    • /usr/local:第三方應用程式的安裝位置,其下也有bin、lib、etc、share等檔案
  12. /var:variable data files,擁有第二層FHS目錄結構

    • cache: 應用程式快取資料目錄
    • lib: 應用程式狀態資訊資料
    • local:專用於為/usr/local下的應用程式儲存可變資料;
    • lock: 鎖檔案
    • log: 日誌目錄及檔案
    • opt: 專用於為/opt下的應用程式儲存可變資料;
    • run: 執行中的程序相關資料,通常用於儲存程序pid檔案
    • spool: 應用程式資料池
    • tmp: 儲存系統兩次重啟之間產生的臨時資料
  13. /proc: 用於輸出核心與程序資訊相關的虛擬檔案系統

3.Linux下的檔案型別:

-:普通檔案
d: 目錄檔案
b: 塊裝置
c: 字元裝置. 如 ll /dev/zero. 該類檔案可以迅速在磁碟中填充一個指定容量的檔案或建立大檔案.

==dd if=/dev/zero of=/data/bigfile bs=1M count=1024== 表示在data目錄中建立一個bigfile的1G大的檔案
其中,dd為命令,if為input file,of為output file,bs為 block size
由於此檔案問二進位制檔案,cat命令無法看,需要用hexdump命令檢視二進位制檔案
hexdump -c /data/bigfile

l: 符號連結檔案
p: 管道檔案pipe
s: 套接字檔案socket

三、iNode(index node)索引節點

以下內容轉自阮一峰理解iNode

1.iNode是什麼

檔案儲存在硬碟上,硬碟的最小儲存單位叫做"扇區"(Sector)。每個扇區儲存512位元組(相當於0.5KB)。

作業系統讀取硬碟的時候,不會一個個扇區地讀取,這樣效率太低,而是一次性連續讀取多個扇區,即一次性讀取一個"塊"(block)。這種由多個扇區組成的"塊",是檔案存取的最小單位。"塊"的大小,最常見的是4KB,即連續八個 sector組成一個 block。

檔案資料都儲存在"塊"中,那麼很顯然,我們還必須找到一個地方儲存檔案的元資訊,比如檔案的建立者、檔案的建立日期、檔案的大小等等。這種儲存檔案元資訊的區域就叫做inode,中文譯名為"索引節點"。

每一個檔案都有對應的inode,裡面包含了與該檔案有關的一些資訊。

2.iNode的內容

node包含檔案的元資訊,具體來說有以下內容:

  • 檔案的位元組數
  • 檔案擁有者的User ID
  • 檔案的Group ID

  • 檔案的讀、寫、執行許可權

  • 檔案的時間戳,共有三個:

    • ctime指inode上一次變動的時間,
    • mtime指檔案內容上一次變動的時間,
    • atime指檔案上一次開啟的時間。
  • 連結數,即有多少檔名指向這個inode

  • 檔案資料block的位置

可以用stat命令,檢視某個檔案的inode資訊:
在這裡插入圖片描述

3.iNode大小

inode也會消耗硬碟空間,所以硬碟格式化的時候,作業系統自動將硬碟分成兩個區域。一個是資料區,存放檔案資料;另一個是inode區(inode table),存放inode所包含的資訊。

每個inode節點的大小,一般是128位元組或256位元組。inode節點的總數,在格式化時就給定,一般是每1KB或每2KB就設定一個inode。假定在一塊1GB的硬碟中,每個inode節點的大小為128位元組,每1KB就設定一個inode,那麼inode table的大小就會達到128MB,佔整塊硬碟的12.8%。
(128M是這麼來的,1k/1G=128B/128M)

df -i   檢視硬碟分割槽可用的iNode總數和已經使用的數量
sudo dumpe2fs -h /dev/hda | grep "Inode size"    檢視每一個節點的大小

==注意:由於每個檔案都必須有一個inode,因此有可能發生inode已經用光,但是硬碟還未存滿的情況。這時,就無法在硬碟上建立新檔案。實驗如下:==

echo file{1..524288} | xargs touch  表示在當前資料夾下建立file1,file2....file524288個檔案,將iNode全部用光
echo file*|xargs rm  刪除當前資料夾內file開頭的檔案

在這裡插入圖片描述
可見,當iNode號碼用光後無法再建立新的檔案

4.inode號碼及系統開啟檔案的過程

每個inode都有一個號碼,作業系統用inode號碼來識別不同的檔案。

這裡值得重複一遍,Unix/Linux系統內部不使用檔名,而使用inode號碼來識別檔案。對於系統來說,檔名只是inode號碼便於識別的別稱或者綽號。

表面上,使用者通過檔名,開啟檔案。實際上,系統內部這個過程分成三步:首先,系統找到這個檔名對應的inode號碼;其次,通過inode號碼,獲取inode資訊;最後,根據inode資訊,找到檔案資料所在的block,讀出資料。

ls -i     #檢視當前資料夾下各個檔案的inode號碼
ls -i /data/file1   #檢視/data/file1檔案的inode號碼

5.目錄檔案

Unix/Linux系統中,目錄(directory)也是一種檔案。開啟目錄,實際上就是開啟目錄檔案。

==目錄檔案的結構非常簡單,就是一系列目錄項(dirent)的列表。每個目錄項,由兩部分組成:所包含檔案的檔名,以及該檔名對應的inode號碼。==
/etc目錄下各檔案的inode號碼
在這裡插入圖片描述
/etc這個目錄檔案本身的inode號碼
在這裡插入圖片描述
目錄檔案的讀許可權(r)和寫許可權(w),都是針對目錄檔案本身。由於目錄檔案內只有檔名和inode號碼,所以如果只有讀許可權,只能獲取檔名,無法獲取其他資訊,因為其他資訊都儲存在inode節點中,而讀取inode節點內的資訊需要目錄檔案的執行許可權(x)。

一般情況下,檔名和inode號碼是"一一對應"關係,每個inode號碼對應一個檔名。但是,Unix/Linux系統允許,多個檔名指向同一個inode號碼。

這意味著,可以用不同的檔名訪問同樣的內容;對檔案內容進行修改,會影響到所有檔名;但是,刪除一個檔名,不影響另一個檔名的訪問。這種情況就被稱為"硬連結"(hard link)。
ln 原始檔 目標檔案

ln a b    
ln a c   a b c三個檔案完成了硬連結

實驗,a,b,c三個檔案完成了硬連結,現在修改b檔案內容,結果如何?
在這裡插入圖片描述
可見,對硬連結的檔案,修改任何一個三個檔案的大小均有變動,但inode號碼保持相同且不變

==注意:由於inode號碼在各分割槽之間互相獨立,多以硬連結不可以跨分割槽建立==
這裡順便說一下目錄檔案的"連結數"。建立目錄時,預設會生成兩個目錄項:"."和".."。前者的inode號碼就是當前目錄的inode號碼,等同於當前目錄的"硬連結";後者的inode號碼就是當前目錄的父目錄的inode號碼,等同於父目錄的"硬連結"。所以,任何一個目錄的"硬連結"總數,總是等於2加上它的子目錄總數(含隱藏目錄)。

7.軟連結(可以理解成windows的快捷方式)

檔案A和檔案B的inode號碼雖然不一樣,但是檔案A的內容是檔案B的路徑。讀取檔案A時,系統會自動將訪問者導向檔案B。因此,無論開啟哪一個檔案,最終讀取的都是檔案B。這時,檔案A就稱為檔案B的"軟連結"(soft link)符號連結(symbolic link)

這意味著,檔案A依賴於檔案B而存在,如果刪除了檔案B,開啟檔案A就會報錯:"No such file or directory"。這是軟連結與硬連結最大的不同:==檔案A指向檔案B的檔名,而不是檔案B的inode號碼,檔案B的inode"連結數"不會因此發生變化。==
ln -s命令可以建立軟連結。
在這裡插入圖片描述
注意:建立軟連結時,注意絕對路徑與相對路徑的區分

==8.inode的特殊作用==

由於inode號碼與檔名分離,這種機制導致了一些Unix/Linux系統特有的現象。

  1. 有時,檔名包含特殊字元,無法正常刪除。這時,直接刪除inode節點,就能起到刪除檔案的作用。

  2. 移動檔案或重新命名檔案,只是改變檔名,不影響inode號碼。

  3. 開啟一個檔案以後,系統就以inode號碼來識別這個檔案,不再考慮檔名。因此,通常來說,系統無法從inode號碼得知檔名。

第3點使得軟體更新變得簡單,可以在不關閉軟體的情況下進行更新,不需要重啟。因為系統通過inode號碼,識別執行中的檔案,不通過檔名。更新的時候,新版檔案以同樣的檔名,生成一個新的inode,不會影響到執行中的檔案。等到下一次執行這個軟體的時候,檔名就自動指向新版檔案,舊版檔案的inode則被回收。

三、練習

  1. 如何建立/testdir/dir1/x, /testdir/dir1/y, /testdir/dir1/x/a, /testdir/dir1/x/b, /testdir/dir1/y/a, /testdir/dir1/y/b
mkdir -p /testdir/dir1/{x,y}/{a,b}
tree

└── testdir
    └── dir1
        ├── x
        │   ├── a
        │   └── b
        └── y
            ├── a
            └── b
  1. 如何建立/testdir/dir2/x,/testdir/dir2/y,/testdir/dir2/x/a,/testdir/dir2/x/b
mkdir -p  /testdir/dir2/{x/{a,b},y}

└── testdir
    └── dir2
        ├── x
        │   ├── a
        │   └── b
        └── y
  1. 如何建立/testdir/dir3, /testdir/dir4, /testdir/dir5, /testdir/dir5/dir6, /testdir/dir5/dir7
mkdir  -p  /testdir/{dir3,dir4,dir5/{dir6,dir7}}
mkdir -p  /testdir/dir{3,4,5/{6,7}}