歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> SHELL編程

Linux.Shell編程筆記-文件和文件系統

第六章 文件和文件系統

LINUX下存在5種文件類型,分別是:

》普通文件

》日錄

》字符設備文件

》塊設備文件

》符號鏈接文件

文件

ls 命令參看文件

-a 列出目錄下的所有文件,包括以 . 開頭的隱含文件。//常用

-l 列出文件的詳細信息。

-t 以時間排序。

參考:http://linux.chinaunix.net/techdoc/system/2009/06/08/1117450.shtml

文件類型

六種:

1. 普通文件:

第一個符號是 - ,這樣的文件在Linux中就是普通文件。這些文件一般是用一些相關的應用程序創建,比如圖像工具、文檔工具、歸檔工具... .... 或 cp工具等。

2. 目錄

目錄在Linux是一個比較特殊的文件。注意它的第一個字符是d。創建目錄的命令可以用 mkdir 命令,或cp命令,cp可以把一個目錄復制為另一個目錄。刪除用rm 或rmdir命令。

3. 字符設備

第一個字符是 c ,這表示字符設備文件。比如內存、終端、黑洞

4. 塊設備文件

第一個字符是b,這表示塊設備,比如硬盤,光驅等設備;這個種類的文件,是用mknode來創建,用rm來刪除。

5. 符號鏈接文件

第一個字符是l,這類文件是鏈接文件。

6. 套接口文件

第一個字符是 s.還有一種是p字符。這種類型很少用。

文件的權限

在Linux中的每一個文件或目錄都包含有訪問權限,這終訪問權限決定了誰能訪問和如何訪問這些文件和目錄。

用戶分組

對於一個文件來說,可以針對3種不同的用戶類型設置不同的訪問權限。這3種用戶類型是:

owner所有者,指創建文件的用戶。

Group用戶組,用戶組是指一組相似用戶。用戶組中的單個用戶能夠設置其所在的用戶

組訪問該用戶文件的權限口例如,某一類或某一項目中的所有用戶都能被系統管理員歸為一個用戶組,一個組成員能夠授予項目組中其他成員所創建的文件的訪問權限。

other其他用戶,用戶也將自己的文件向系統內的所有用戶開放。在這種情況下,系統

內的所有用戶都能夠訪問用戶的目錄或文件。在這種意義上,系統內的其他所有用戶就是other用戶類。

可以從以下3種訪問方式限制訪問權限:只允許用戶自己(owner)訪問;允許一個預先指定

的用戶組中的用戶(group)訪問;允許系統中的任何用戶(other)訪問。

[houchangren@ebsdi-23260-oozie data]$ cat /etc/passwd|head -2
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

在/etc/passwd每個記錄都有7個字段組成,分別是
用戶名、

加密格式的口令、

數字的user id、

數字的group id、

全名或賬戶的其他說明、

家目錄、

登錄shell(登錄時運行的程序)。

[houchangren@ebsdi-23260-oozie data]$ cat /etc/group | grep root
root:x:0:root,huanghu,dyw
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon
sys:x:3:root,bin,adm
adm:x:4:root,adm,daemon
disk:x:6:root
wheel:x:10:root

在用戶分組文件/etc/group 中寫著那個用戶屬於那個組,那個組有那幾個用戶的信息。

如果想把某一個用戶寫到root組下,直接在最後一列中加入即可。

Chmod 改變文件權限的命令

Chown 改變文件所有者的命令

Chgrp 改變文件所屬分組的命令

文件訪問權限

用戶能夠控制一個給定的文件或目錄的被訪問程度。一個文件或目錄可能有讀、寫及執行權限。當創建一個文件時,系統會自動賦予文件所有者讀和寫的權限,這樣可以允許所有者顯示文件內容和修改文件。文件所有者可以將這些權限改變為任何他想指定的權限。一個文件也許只有讀權限,禁止任何修改。也可能只有執行權限,允許它像個程序一樣執行。

對於每個文件來說,文件所有者或超級用戶可以設置該文件的可讀、可寫和可執行權限,它們分別是r,w, x。

r( Read讀取)對文件而言,具有讀取文件內容的權限;對n錄來說,具有浏覽目錄的權限。

w(Write,寫入)對文件而言,具有新增、修改文件內容的權限;對目錄來說,具有刪除、移動目錄內文件的權限。

x(exeute,執行)對文件而言,具有執行文件的權限;對日錄來說,該用戶具有進入目錄的權限。

Umask 命令

此外,默認的權限可用umask命令修改,用法非常簡單,只需執行umask 777命令,便代表屏蔽所有的權限,因而之後建立的文件或目錄,其權限都變成000,依次類推。通常root賬號搭配umask命令的數值為022,027,077等,普通用戶則是采用002,這樣所產生的權限依次為755,750, 700. 775等。

文件權限數字表示法

文件和目錄的權限表示,是用rwx這3個字符來代表所有者、用戶組和其他用戶的權限。有時候,字符似乎過於麻煩,因此還有另外一種方法是以數字來表示權限,而且僅需3個數字。

r對應數值4

w對應數值2

x 對應數值1

-對應數值0

上邊對應的值的組合就是權限的數字

比如: 777 就是任何人都有rwx都有 4+2+1……4+2+1…… 4+2+1

700就是只有用戶所有者能rwx

其實對應的原型是二進制的

比如–rw-rw-xw- 只要有值就對應的是1,沒值對應的是0 那麼對應的二進制就是-110110110

特殊權限

由於特殊權限會擁有一些“特權”,因而用戶若無特殊需求,不應該啟用這些權限。以避免安全方而出現嚴重的漏洞,造成黑客入侵,其至摧毀系統!

具體內容參考http://www.cnblogs.com/huangzhen/archive/2011/08/22/2149300.html

文件的修改時間

touch命令可以修改創建時間,如果不指定-c的參數,不存在則創建。

尋找文件

在UNIX、linux下尋找文件的機制很強大,使用find命令與其他工具結合時,你就能:

(1)找到符合某種規則的文件;

(2)對這類文件依次執行某命令。

Find 命令

公式: 用法:find [路徑...] [表達式]

find命令的一般格式為:

find [pathname][-options][-print -exec -ok ...]

在命令中的參數解釋如下:

pathname find命令所查找的日錄路徑。例如用來表示當前目錄,用徕表示系統根目錄。

-print find命令將匹配的文件輸出到標准輸出.

-exec find命令對匹配的文件執行該參數所給出的shell命令。相應命令的形式為'command'{} \;,注意{}和\;之間的空格.

-ok和-exec的作用相同,只不過以一種更為安全的模式來執行該參數所給出的shell命令,在執行每一個命令之前,都會給出提示,讓用戶來確定是否執行。

實例:

[houchangren@ebsdi-23260-ooziedata]$ find ../ -iname "*.sh" -print
../checkUserIsExist.sh
../if.sh
../testwhile.sh
../add.sh
../testfor.sh
../testalg.sh
../user_login.sh
../whileexample.sh
../a.sh
../testcase.sh
../whileexample2.sh
 
[houchangren@ebsdi-23260-ooziedata]$ mkdir ../../tmp
[houchangren@ebsdi-23260-ooziedata]$ find ../ -iname "*.sh" -exec cp {} ../../tmp/ \;
[houchangren@ebsdi-23260-ooziedata]$ ll ../../tmp/
總計 44
-rw-rw-r-- 1houchangren houchangren  51 01-20 16:14add.sh
-rw-rw-r-- 1houchangren houchangren 337 01-20 16:14 a.sh
-rw-rw-r-- 1houchangren houchangren  85 01-20 16:14checkUserIsExist.sh
-rw-rw-r-- 1houchangren houchangren  55 01-20 16:14if.sh
-rwxrwxr-x 1houchangren houchangren 284 01-20 16:14 testalg.sh
-rw-rw-r-- 1houchangren houchangren 206 01-20 16:14 testcase.sh
-rw-rw-r-- 1houchangren houchangren  42 01-20 16:14testfor.sh
-rw-rw-r-- 1houchangren houchangren 319 01-20 16:14 testwhile.sh
-rw-rw-r-- 1houchangren houchangren 132 01-20 16:14 user_login.sh
-rw-rw-r-- 1houchangren houchangren 193 01-20 16:14 whileexample2.sh
-rw-rw-r-- 1houchangren houchangren 253 01-20 16:14 whileexample.sh
[houchangren@ebsdi-23260-ooziedata]$

還有很多的find的用法,參考:

http://www.cnblogs.com/wanqieddy/archive/2011/06/09/2076785.html.

遍歷文件

當find文件太多傳入到下一個exec的時候,如果參數太多,就會報錯。這個時候可以使用xargs命令來接受一批批處理.

find命令把匹配到的文件傳遞給xargs命令,而xargs命令每次只獲取一鄙分文件而不是全部,不像–exe的選項那樣。這樣它可以先處理最先獲取的一部分文件,然後是下一批,並如此繼續下去。

在有些系統中,使用-exec選項會為處理梅一個匹配到的文件發起一個相應的進程,並非將匹配到的文件全部作為參數一次執行;這樣在有些情況下就會出現進程過多、系統性能下降的問題,因而效率不高;

而使用xargs命令則只有一個進程。另外,在使用xargs命令時,究竟是一次獲取所有的參數.還是分批取得參數,以及每一次獲取參數的數目.都會根據該命令的選項及系統內核中相應的可調參數來確定。

查詢當前目錄的所有普通文件然後執行file命令

[houchangren@ebsdi-23260-ooziedata]$ find  . -type f |xargs file
./sort.txt:        ASCII text
./fruit.txt:       ASCII text
./ips.txt:         ASCII text
./stuff.txt:       ASCII text
./ips.txt.t:       ASCII text
./fruits.txt:      ASCII text
./fruit.txt.rep:   ASCII text
./fruit.txt.upper:ASCII text
./salary.txt:      ASCII text
./fruit.txt.rm:    ASCII text
 

查詢當前目錄下普通文件並且有包含apple字符的文件信息。

[houchangren@ebsdi-23260-oozie data]$find  . -type f |xargs grep 'apple'
./fruit.txt:apple
./fruit.txt:apple 
./fruits.txt:1:2:apple-2
./fruits.txt:1:2:apple-1

比較文件

在UNIX/Linux下比較文件差異的方法很多,最經典的就是使用comm, diff命令。此外,一些文木編輯器提供了交互式的比較文件的方法,並且使用更人性化的顯示方式表現出來

使用comm比較排序後文件

comm這項指令會一行行地比較兩個已排序文件的差異,並將其結果顯示出來,如果沒有指定任何參數,則會把結果分成3列顯示;第1列儀是在第1個文件中出現過的行,第2列是僅在第2個文件中出現過的行,第3列則是在第1與第2個文件裡都出現過的行。若給予的文件名稱為“-num”,則comm指令會從標准輸入設備讀取數據口

comm用法

comm file1 file2

comm [-123] filefile2

-1 不顯示只在第1個文件裡出現過的列。

-2 不顯示只在第2個文件裡出現過的列。

-3 不顯示只在第1個和第2個文件裡出現過的列。

使用diff比較文件

diff命令的功能為逐行比較兩個文木文件,列出其不同之處。它比comm命令更能完成復雜的檢查。它對給出的文件進行系統的檢查,並顯示出兩個文件中所有不同的行,不要求事先對文件進行排序。

Diff命令的輸出格式
 

file1影響行

Action

file2影響行

Number1

a

Number2[,Number3]

Number1[,Number2]

d

Number3

Number1[,Number2]

c

Number3[,Number4]

這些行類似於edit子戶命令將file1文件轉換成f ile2文件。Action字母之前的數字指file1,後面的數字則指file2因此,通過將a替換成d,從右往左讀,你就能知進如何將file2轉換成file1。在edit命令下,相同的對(即Numbed =Nurnber2)會簡略為單個數字。

下列每一行,diff命令顯不以<:(小於符號,冒號)開始的第一個文件中的所有受形響行,然後顯示以>(大於符號)開始的第二個文件中的所有受影響行。

實例:

[houchangren@ebsdi-23260-ooziedata]$ diff fruit.txt fruit1.txt
2c2
< banana  
---
>1banana  
5c5
<%%banae 
---
>1%%banae 
 
[houchangren@ebsdi-23260-ooziedata]$ diff fruit.txt fruit2.txt
8,9d7
< orange  
< persimmon
 
[houchangren@ebsdi-23260-ooziedata]$ diff fruit2.txt fruit.txt
7a8,9
> orange  
> presimmon

執行:diff –help或者下邊

Diff參數參考:http://linux.chinaunix.net/techdoc/system/2007/08/01/964240.shtml

其他比較工具

Vimdiff工具-提供了GUI的文本比較方式

用法

[houchangren@ebsdi-23260-oozie data]$vimdiff fruit2.txt fruit.txt

網上參考:

http://blog.chinaunix.net/uid-361890-id-175414.html

http://www.ibm.com/developerworks/cn/linux/l-vimdiff/

文件系統

與Windows不同的是,UNIX/Linux支持多種文件系統(Windows只支持常見的Fat32和

NTFS ) ,簡直可以稱得上操作系統中的瑞士軍刀。UNIX/Linux下常見的文件系統有ext3, ext4, reiserfs, ZFS等,UNIX/Linux在一些特殊場景下也有特殊文件系統,例如,用於掛載交換目錄

(/tmp)的tmpfs,用於網絡的NFS等。

什麼是文件系統

盡管內核是Linux的核心,文件卻是用戶與操作系統交互所采用的主要工具。這對Linux來說尤其如此,這是因為在LINUX傳統中,它使用文件I/O機制管理硬件設備和數據文件。

遺憾的是,新手通常會混淆介紹Linux文件系統概念的術語。術語文件系統可以在Linux文件編制中互換使用,用於指代幾個不同但相關的概念。除磁盤分區的具體實例外,文件系統還指代數據結構,以及分區中文件的管理方法。

令新手更感困惑的是,該術語還用於指代系統中文件的整體組織形式:目錄樹,此外,該術語還可以指代目錄樹中的每個子目錄,如在/home文件系統中.某些人認為,這些目錄和目錄不能稱作真正意義上的文件系統,除非它們均駐留在各自的磁盤分區上。然而,其他人卻將其稱作文件系統,這無疑又增添了困惑。

Linux老手可以從上下文中理解這些術語的含義。新手卻很難在一時半會兒就辨別出這樣的上下文。

文件系統和磁盤分區

磁盤是一個可讀可寫的設備。在磁盤上,有許許多多的磁道,磁道的讀取器(磁頭)可以在磁盤飛轉時讀寫磁盤。但是,很多時候,一塊磁盤能夠容納的數據量很大,故為了方便管理,我們將磁盤的一條條磁道分為幾個部分,每個部分對應用於一塊磁盤分區。

我們通常將文件系統認為是磁盤分區。UNIX/Linux中的基本文件存儲單元都是磁盤分區,即將一個或多個硬盤進行邏輯劃分,操作系統將每個邏輯分區視為獨立的磁盤。有時候,一塊磁盤過於龐大,我們要合理地規劃分區,才一能有效阻止在磁盤上的存儲。

Linux將這些磁盤分區做為設備處理,進而通過/dev目錄中的特殊文件使用文件I/0機制。有兩種類型的設備文件:塊設備和字符設備。兩者之間的一個重要差別是,塊設備被緩沖,而字符設備因為沒有文件管理系統,所以不被緩沖。

操作系統為了有效地和磁盤打交道(檢索、存儲、讀取磁盤等),將磁盤的存儲方式按照一定的規則統一起來。這種規則規定了文件是怎樣被映射(住)進磁盤的分區磁道中的;規定了當沒有足夠連續的磁道存儲大文件時,是怎樣通過多個不連續磁道拼接容納文件的,等等。這個規則就叫做文件管理系統,或者叫做磁盤分區格式。

存儲在磁盤最開始位置的分區表提供了該磁盤上分區的映射口可以使用fdisk命令查看系統的分區表:

[root@ebsdi-23260-oozie~]# fdisk –l
Disk /dev/sda:85.8 GB, 85899345920 bytes
255 heads, 63sectors/track, 10443 cylinders
Units =cylinders of 16065 * 512 = 8225280 bytes
 
   Device Boot      Start         End      Blocks  Id  System
/dev/sda1   *          1          13      104391  83  Linux
/dev/sda2              14       10443   83778975   8e  Linux LVM

\

這個例子顯示了本台主機只有一塊硬盤,sda.如果有兩塊以上的話,則是sdb,sdc等。如果是IDE驅動器的話,則是had.馭動器內的分區用數字指代,因此/dev/sda5是第一個SCSI驅動器上的第五個分區。

第一至第四個分區保留給主分區,第五個及隨後的分區用於邏輯分區.因此,以上所示的分區表中有一個驅動器sda,它包含4個主分sda1到sda4、一個擴展分區sda5.

在Linux中,分區包括主分區、擴展分區和邏輯分區。術語主分區是先前x86系統上4個分區限制的遺留產物。與Dos和Windows不同,linux可以從主分區或邏輯分區啟動。用作邏輯分區占位符的主分區稱作擴展分區。擴展分區本身擁有指向個或多個邏輯分區(它們只是主分區的子分區)的分區表。在以上的fdisk列表中,sda4就是一個擴展分區。

fdisk除了能夠查看分區表外,還能夠修改分區表。事實上,fdisk就是個分區表修改器。例如,當我們要修改/dev/sda的分區表時,可以用fdisk操作. 

[root@ebsdi-23260-oozie~]# fdisk /dev/sda1
Device containsneither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a newDOS disklabel. Changes will remain in memory only,
until you decideto write them. After that, of course, the previous
content won't berecoverable.
 
Warning: invalidflag 0x0000 of partition table 4 will be corrected by w(rite)
 
Command (m forhelp): m
Command action
   a   togglea bootable flag
   b  edit bsd disklabel
   c  toggle the dos compatibility flag
   d  delete a partition
   l  list known partition types
   m  print this menu
   n  add a new partition
   o  create a new empty DOS partition table
   p  print the partition table
   q  quit without saving changes
   s  create a new empty Sun disklabel
   t  change a partition's system id
   u  change display/entry units
   v  verify the partition table
   w  write table to disk and exit
   x  extra functionality (experts only)
 
Command (m forhelp): 

在fdisk的交互命令行中,你可以完成分區、刪除、修改、添加、格式化分區等操作。我們可以通過m命令查看fdisk的幫助文檔。

如果你不喜歡問答式的分區方式,可以選擇交互式的命令cfdisk,運行命令

cfdisk /dev/sda1

彈出交互式界面如下圖

\

在這個界面中,可以通過上下左右鍵來移動光標,可以刪除、新建分區,還可以規定分區格式。cfdisk其實就是fdisk的圖形界面。

Linux分區格式的選擇與安全性

UNIX/Linux號稱文件系統(分區格式)的瑞士軍刀,可以選擇的分區格式也多種多樣。除了

支持Windows 下的FAT32、NTFS分區格式外(支持讀寫,不支持作為根文件系統),常見於坊間的有ext2 ,ext3 , reiserfs等。此外,各個著名的操作系統往往有自己文件系統方面的殺手銅,例如,Solaris的ZFS文件系統,Apple的HFS+文件系統等。

Linux 下常用文件系統格式有ext2,ext3,swap,VFAT,reiserfs等。

Ext2:

Ext2是GNU/Linux系統中標准的文件系統。這是Linux中使用最多的一種文件系統,它是專門為Linux設計的,擁有極快的速度和極小的CPU占用率。Ext2既可以用於標准的塊設備(如硬盤),也被應用在軟盤等移動存儲設備上。

Ext3:

Ext3是Ext2的下一代,也就是保有Ext2的格式之下再加上日志功能。Ext3是一種日志式文件系統(JournalFile System),最大的特點是:它會將整個磁盤的寫入動作完整的記錄在磁盤的某個區域上,以便有需要時回溯追蹤。當在某個過程中斷時,系統可以根據這些記錄直接回溯並重整被中斷的部分,重整速度相當快。該分區格式被廣泛應用在Linux系統中。

Linux swap:

它是Linux中一種專門用於交換分區的swap文件系統。Linux是使用這一整個分區作為交換空間。一般這個swap格式的交換分區是主內存的2倍。在內存不夠時,Linux會將部分數據寫到交換分區上。

VFAT:

VFAT叫長文件名系統,這是一個與Windows系統兼容的Linux文件系統,支持長文件名,可以作為Windows與Linux交換文件的分區。

文件系統和目錄樹

參考:http://blog.csdn.net/ruishenh/article/details/18602117

文件系統的創建和掛載

當使用fdisk或者cfdisk將磁盤劃分為多個區時,需要給劃分後的磁盤的每個區制定分區格式。在Windows中,這個概念叫做磁盤格式化,命令是mkfs.

Mkfs創建命令參考:

http://blog.163.com/yi_yixinyiyi/blog/static/136286889201164102353634/

Mount掛載命令參考:
http://www.51ou.com/browse/linuxml/mount.html

umonut卸載命令參考:

http://www.51ou.com/browse/linuxml/umount.html

Copyright © Linux教程網 All Rights Reserved