對於每個Linux學習者來講,瞭解Linux文件系統的目錄結構,是學好Linux的相當重要的一步.,深刻了解linux文件目錄結構的標準和每一個目錄的詳細功能,對於咱們用好linux系統只管重要,下面咱們就開始瞭解一下linux目錄結構的相關知識。php
當 在使用Linux的時候,若是您經過ls –l / 就會發現,在/下包涵不少的目錄,好比etc、usr、var、bin ... ... 等目錄,而 在這些目錄中,咱們進去看看,發現也有不少的目錄或文件。文件系統在Linux下看上去就象樹形結構,因此咱們能夠把文件系統的結構形象的稱爲 樹形結 構。html
文 件系統的是用來組織和排列文件存取的,因此她是可見的,在Linux中,咱們能夠經過ls等工具來查看其結構,在Linux系統中,咱們見到的都是樹形結 構;好比操做系統安裝在一個文件系統中,他表現爲由/ 起始的樹形結構。linux文件系統的最頂端是/,咱們稱/爲Linux的root,也就 是 Linux操做系統的文件系統。Linux的文件系統的入口就是/,全部的目錄、文件、設備都在/之下,/就是Linux文件系統的組織者,也是最上 級的領導者。java
因爲linux是開放源代碼,各大公司和團體根據linux的核心代碼作各自的操做,編程。這樣就形成在根下的目錄的不一樣。這樣就形成我的不能使用他人的linux系統的PC。由於你根本不知道一些基本的配置,文件在哪裏。。。這就形成了混亂。這就是FHS(Filesystem Hierarchy Standard )機構誕生的緣由。該機構是linux愛好者自發的組成的一個團體,主要是是對linux作一些基本的要求,不至因而操做者換一臺主機就成了linux的‘文盲’。node
根 據FHS(http://www.pathname.com/fhs/)的官方文件指出, 他們的主要目的是但願讓使用者能夠了解到已安裝軟件一般放置於 那個目錄下, 因此他們但願獨立的軟件開發商、操做系統製做者、以及想要維護系統的用戶,都可以遵循FHS的標準。 也就是說,FHS的重點在於規範每一個 特定的目錄下應該要放置什麼樣子的數據而已。 這樣作好處很是多,由於Linux操做系統就可以在既有的面貌下(目錄架構不變)發展出開發者想要的獨特風 格。python
事實上,FHS是根據過去的經驗一直再持續的改版的,FHS依據文件系統使用的頻繁與否與是否容許使用者隨意更動, 而將目錄定義成爲四種交互做用的形態,用表格來講有點像底下這樣:mysql
|
可分享的(shareable)linux |
不可分享的(unshareable)ios |
不變的(static)nginx |
/usr (軟件放置處)c++ |
/etc (配置文件) |
/opt (第三方合力軟件)(IBM)( WebSphere) |
/boot (開機與核心檔) |
|
可變更的(variable) |
/var/mail (使用者郵件信箱) |
/var/run (程序相關) |
/var/spool/news (新聞組) |
/var/lock (程序相關) |
四中類型:
1. 可分享的:
能夠分享給其餘系統掛載使用的目錄,因此包括執行文件與用戶的郵件等數據, 是可以分享給網絡上其餘主機掛載用的目錄;
2. 不可分享的:
本身機器上面運做的裝置文件或者是與程序有關的socket文件等, 因爲僅與自身機器有關,因此固然就不適合分享給其餘主機了。
3. 不變的:
有些數據是不會常常變更的,跟隨着而不變更。 例如函式庫、文件說明文件、系統管理員所管理的主機服務配置文件等等;
4. 可變更的:
常常改變的數據,例如登陸文件、通常用戶可自行收受的新聞組等。
事實上,FHS針對目錄樹架構僅定義出三層目錄底下應該放置什麼數據而已,分別是底下這三個目錄的定義:
/ (root, 根目錄):與開機系統有關;
/usr (unix software resource):與軟件安裝/執行有關;
/var (variable):與系統運做過程有關。
一. 根目錄 (/) 的意義與內容:
根 目錄是整個系統最重要的一個目錄,由於不但全部的目錄都是由根目錄衍生出來的, 同時根目錄也與開機/還原/系統修復等動做有關。 因爲系統開機時須要特 定的開機軟件、核心文件、開機所需程序、 函式庫等等文件數據,若系統出現錯誤時,根目錄也必需要包含有可以修復文件系統的程序才行。 由於根目錄是這麼 的重要,因此在FHS的要求方面,他但願根目錄不要放在很是大的分區, 由於越大的分區內你會放入越多的數據,如此一來根目錄所在分區就可能會有較多發生 錯誤的機會。
所以FHS標準建議:根目錄(/)所在分區應該越小越好, 且應用程序所安裝的軟件最好不要與根目錄放在同一個分區內,保持根目錄越小越好。 如此不但效能較佳,根目錄所在的文件系統也較不容易發生問題。說白了,就是根目錄和Windows的C盤一個樣。
根據以上緣由,FHS認爲根目錄(/)下應該包含以下子目錄:
目錄 |
應放置檔案內容 |
/bin |
系統有不少放置執行檔的目錄,但/bin比較特殊。由於/bin放置的是在單人維護模式下還可以被操做的指令。在/bin底下的指令能夠被root與通常賬號所使用,主要有:cat,chmod(修改權限), chown, date, mv, mkdir, cp, bash等等經常使用的指令。 |
/boot |
主要放置開機會使用到的檔案,包括Linux核心檔案以及開機選單與開機所需設定檔等等。Linux kernel經常使用的檔名爲:vmlinuz ,若是使用的是grub這個cd 開機管理程式,則還會存在/boot/grub/這個目錄。 |
/dev |
在 Linux系統上,任何裝置與周邊設備都是以檔案的型態存在於這個目錄當中。 只要經過存取這個目錄下的某個檔案,就等於存取某個裝置。比要重要的檔案有 /dev/null, /dev/zero, /dev/tty , /dev/lp*, / dev/hd*, /dev/sd*等等 |
/etc |
系 統主要的設定檔幾乎都放置在這個目錄內,例如人員的賬號密碼檔、各類服務的啓始檔等等。 通常來講,這個目錄下的各檔案屬性是可讓通常使用者查閱的,但 是隻有root有權力修改。 FHS建議不要放置可執行檔(binary)在這個目錄中。 比較重要的檔案有:/etc/inittab, /etc /init.d/, /etc/modprobe.conf, /etc/X11/, /etc/fstab, /etc/sysconfig/等 等。 另外,其下重要的目錄有:/etc/init.d/ :全部服務的預設啓動script都是放在這裏的,例如要啓動或者關閉iptables的 話: /etc/init.d/iptables start、/etc/init.d/ iptables stop /etc/xinetd.d/ :這就是所謂的super daemon管理的各項服務的設定檔目錄。 /etc/X11/ :與X Window有關的各類設定檔都在這裏,尤爲是xorg.conf或XF86Config這兩個X Server的設定檔。 |
/home |
這是系統預設的使用者家目錄(home directory)。 在你新增一個通常使用者賬號時,預設的使用者家目錄都會規範到這裏來。比較重要的是,家目錄有兩種代號: |
/lib |
系 統的函式庫很是的多,而/lib放置的則是在開機時會用到的函式庫,以及在/bin或/sbin底下的指令會呼叫的函式庫而已 。 什麼是函式庫呢?妳可 以將他想成是外掛,某些指令必需要有這些外掛纔可以順利完成程式的執行之意。 尤爲重要的是/lib/modules/這個目錄,由於該目錄會放置核心相 關的模組(驅動程式)。 |
/media |
media是媒體的英文,顧名思義,這個/media底下放置的就是可移除的裝置。 包括軟碟、光碟、DVD等等裝置都暫時掛載於此。 常見的檔名有:/media/floppy, /media/cdrom等等。 |
/mnt |
若是妳想要暫時掛載某些額外的裝置,通常建議妳能夠放置到這個目錄中。在古早時候,這個目錄的用途與/media相同啦。 只是有了/media以後,這個目錄就用來暫時掛載用了。 |
/opt |
這 個是給第三方合力軟體放置的目錄 。 什麼是第三方合力軟體啊?舉例來講,KDE這個桌面管理系統是一個獨立的計畫,不過他能夠安裝到Linux系統中, 所以KDE的軟體就建議放置到此目錄下了。 另外,若是妳想要自行安裝額外的軟體(非本來的distribution提供的),那麼也可以將你的軟體安裝 到這裏來。 不過,之前的Linux系統中,咱們仍是習慣放置在/usr/local目錄下。 |
/root |
系統管理員(root)的家目錄。 之因此放在這裏,是由於若是進入單人維護模式而僅掛載根目錄時,該目錄就可以擁有root的家目錄,因此咱們會但願root的家目錄與根目錄放置在同一個分區中。 |
/sbin |
Linux 有很是多指令是用來設定系統環境的,這些指令只有root纔可以利用來設定系統,其餘使用者最多隻能用來查詢而已。放在/sbin底下的爲開機過程當中所需 要的,裏面包括了開機、修復、還原系統所須要的指令。至於某些伺服器軟體程式,通常則放置到/usr/sbin/當中。至於本機自行安裝的軟體所產生的系 統執行檔(system binary),則放置到/usr/local/sbin/當中了。常見的指令包 括:fdisk, fsck, ifconfig, init, mkfs等等。cd |
/srv |
srv能夠視爲service的縮寫,是一些網路服務啓動以後,這些服務所須要取用的資料目錄。 常見的服務例如WWW, FTP等等。 舉例來講,WWW伺服器須要的網頁資料就能夠放置在/srv/www/裏面。呵呵,看來平時咱們編寫的代碼應該放到這裏了。 |
/tmp |
這是讓通常使用者或者是正在執行的程序暫時放置檔案的地方。這個目錄是任何人都可以存取的,因此你須要按期的清理一下。固然,重要資料不可放置在此目錄啊。 由於FHS甚至建議在開機時,應該要將/tmp下的資料都刪除。 |
事實上FHS針對根目錄所定義的標準就僅限於上表,不過仍舊有些目錄也須要咱們瞭解一下,具體以下:
目錄 |
應放置文件內容 |
/lost+found |
這 個目錄是使用標準的ext2/ext3檔案系統格式纔會產生的一個目錄,目的在於當檔案系統發生錯誤時,將一些遺失的片斷放置到這個目錄下。 這個目錄通 常會在分割槽的最頂層存在,例如你加裝一個硬盤於/disk中,那在這個系統下就會自動產生一個這樣的目錄/disk/lost+found |
/proc |
這個目錄自己是一個虛擬文件系統(virtual filesystem)喔。 他放置的資料都是在內存當中,例如系統核心、行程資訊(process)(是進程嗎?)、周邊裝置的狀態及網絡狀態等等。由於這個目錄下的資料都是在記憶體(內存)當中,因此自己不佔任何硬盤空間。比較重要的檔案(目錄)例如: /proc/cpuinfo, /proc/dma, /proc/interrupts, /proc/ioports, /proc/net/*等等。呵呵,是虛擬內存嗎[guest]? |
/sys |
這個目錄其實跟/proc很是相似,也是一個虛擬的檔案系統,主要也是記錄與核心相關的資訊。 包括目前已載入的核心模組與核心偵測到的硬體裝置資訊等等。 這個目錄一樣不佔硬盤容量。 |
除了這些目錄的內容以外,另外要注意的是,由於根目錄與開機有關,開機過程當中僅有根目錄會被掛載, 其餘分區則是在開機完成以後纔會持續的進行掛載的行爲。就是由於如此,所以根目錄下與開機過程有關的目錄, 就不可以與根目錄放到不一樣的分區去。那哪些目錄不可與根目錄分開呢?有底下這些:
/etc:配置文件
/bin:重要執行檔
/dev:所須要的裝置文件
/lib:執行檔所需的函式庫與核心所需的模塊
/sbin:重要的系統執行文件
這五個目錄千萬不可與根目錄分開在不一樣的分區。請背下來啊。
二. /usr 的意義與內容:
依據FHS的基本定義,/usr裏面放置的數據屬於可分享的與不可變更的(shareable, static), 若是你知道如何透過網絡進行分區的掛載(例如在服務器篇會談到的NFS服務器),那麼/usr確實能夠分享給局域網絡內的其餘主機來使用喔。
/usr 不是user的縮寫,其實usr是Unix Software Resource的縮寫, 也就是Unix操做系統軟件資源所放置的目錄,而不是用戶的數據啦。這點要注意。 FHS建議全部軟件開發者,應該將他們的數據合理的分別放置到這個目錄下的次目錄,而不要自行創建該軟件本身獨立的目錄。
因 爲是全部系統默認的軟件(distribution發佈者提供的軟件)都會放置到/usr底下,所以這個目錄有點相似Windows 系統的 C:\Windows\ + C:\Program files\這兩個目錄的綜合體,系統剛安裝完畢時,這個目錄會佔用最多的硬盤容量。 通常來 說,/usr的次目錄建議有底下這些:
目錄 |
應放置文件內容 |
/usr/X11R6/ |
爲X Window System重要數據所放置的目錄,之因此取名爲X11R6是由於最後的X版本爲第11版,且該版的第6次釋出之意。 |
/usr/bin/ |
絕大部分的用戶可以使用指令都放在這裏。請注意到他與/bin的不一樣之處。(是否與開機過程有關) |
/usr/include/ |
c/c++等程序語言的檔頭(header)與包含檔(include)放置處,當咱們以tarball方式 (*.tar.gz 的方式安裝軟件)安裝某些數據時,會使用到裏頭的許多包含檔。 |
/usr/lib/ |
包 含各應用軟件的函式庫、目標文件(object file),以及不被通常使用者慣用的執行檔或腳本(script)。 某些軟件會提供一些特殊的指令來 進行服務器的設定,這些指令也不會常常被系統管理員操做, 那就會被擺放到這個目錄下啦。要注意的是,若是你使用的是X86_64的Linux系統, 那 可能會有/usr/lib64/目錄產生 |
/usr/local/ |
統 管理員在本機自行安裝本身下載的軟件(非distribution默認提供者),建議安裝到此目錄, 這樣會比較便於管理。舉例來講,你的 distribution提供的軟件較舊,你想安裝較新的軟件但又不想移除舊版, 此時你能夠將新版軟件安裝於/usr/local/目錄下,可與原先的 舊版軟件有分別啦。 你能夠自行到/usr/local去看看,該目錄下也是具備bin, etc, include, lib...的次目錄 |
/usr/sbin/ |
非系統正常運做所須要的系統指令。最多見的就是某些網絡服務器軟件的服務指令(daemon) |
/usr/share/ |
放置共享文件的地方,在這個目錄下放置的數據幾乎是不分硬件架構都可讀取的數據, 由於幾乎都是文本文件嘛。在此目錄下常見的還有這些次目錄:/usr/share/man:聯機幫助文件 /usr/share/doc:軟件雜項的文件說明 /usr/share/zoneinfo:與時區有關的時區文件 |
/usr/src/ |
通常原始碼建議放置到這裏,src有source的意思。至於核心原始碼則建議放置到/usr/src/linux/目錄下。 |
三. /var 的意義與內容:
如 果/usr是安裝時會佔用較大硬盤容量的目錄,那麼/var就是在系統運做後纔會漸漸佔用硬盤容量的目錄。 由於/var目錄主要針對常態性變更的文件, 包括緩存(cache)、登陸檔(log file)以及某些軟件運做所產生的文件, 包括程序文件(lock file, run file),或者例 如MySQL數據庫的文件等等。常見的次目錄有:
目錄 |
應放置文件內容 |
/var/cache/ |
應用程序自己運做過程當中會產生的一些暫存檔 |
/var/lib/ |
程序自己執行的過程當中,須要使用到的數據文件放置的目錄。在此目錄下各自的軟件應該要有各自的目錄。 舉例來講,MySQL的數據庫放置到/var/lib/mysql/而rpm的數據庫則放到/var/lib/rpm去 |
/var/lock/ |
某 些裝置或者是文件資源一次只能被一個應用程序所使用,若是同時有兩個程序使用該裝置時, 就可能產生一些錯誤的情況,所以就得要將該裝置上鎖 (lock),以確保該裝置只會給單一軟件所使用。 舉例來講,刻錄機正在刻錄一塊光盤,你想一下,會不會有兩我的同時在使用一個刻錄機燒片? 若是兩個 人同時刻錄,那片子寫入的是誰的數據?因此當第一我的在刻錄時該刻錄機就會被上鎖, 第二我的就得要該裝置被解除鎖定(就是前一我的用完了)纔可以繼續使 用 |
/var/log/ |
很是重要。這是登陸文件放置的目錄。裏面比較重要的文件如/var/log/messages, /var/log/wtmp(記錄登入者的信息)等。 |
/var/mail/ |
放置我的電子郵件信箱的目錄,不過這個目錄也被放置到/var/spool/mail/目錄中,一般這兩個目錄是互爲連接文件。 |
/var/run/ |
某些程序或者是服務啓動後,會將他們的PID放置在這個目錄下 |
/var/spool/ |
這個目錄一般放置一些隊列數據,所謂的「隊列」就是排隊等待其餘程序使用的數據。 這 些數據被使用後一般都會被刪除。舉例來講,系統收到新信會放置到/var/spool/mail/中, 但使用者收下該信件後該封信原則上就會被刪除。信 件若是暫時寄不出去會被放到/var/spool/mqueue/中, 等到被送出後就被刪除。若是是工做排程數據(crontab),就會被放置到 /var/spool/cron/目錄中。 |
因爲FHS僅是定義出最上層(/)及次層(/usr, /var)的目錄內容應該要放置的文件或目錄數據, 所以,在其餘次目錄層級內,就能夠隨開發者自行來配置了。
四. 目錄樹(directory tree) :
在Linux底下,全部的文件與目錄都是由根目錄開始的。那是全部目錄與文件的源頭, 而後再一個一個的分支下來,所以,咱們也稱這種目錄配置方式爲:目錄樹(directory tree), 這個目錄樹的主要特性有:
目錄樹的啓始點爲根目錄 (/, root);
每個目錄不止能使用本地端的 partition 的文件系統,也能夠使用網絡上的 filesystem 。舉例來講, 能夠利用 Network File System (NFS) 服務器掛載某特定目錄等。
每個文件在此目錄樹中的文件名(包含完整路徑)都是獨一無二的。
若是咱們將整個目錄樹以圖的方法來顯示,而且將較爲重要的文件數據列出來的話,那麼目錄樹架構就以下圖所示:
五. 絕對路徑與相對路徑
除了須要特別注意的FHS目錄配置外,在文件名部分咱們也要特別注意。由於根據檔名寫法的不一樣,也可將所謂的路徑(path)定義爲絕對路徑(absolute)與相對路徑(relative)。 這兩種文件名/路徑的寫法依據是這樣的:
絕對路徑:
由根目錄(/)開始寫起的文件名或目錄名稱, 例如 /home/dmtsai/.bashrc;
相對路徑:
相對於目前路徑的文件名寫法。 例如 ./home/dmtsai 或 http://www.cnblogs.com/home/dmtsai/ 等等。反正開頭不是 / 就屬於相對路徑的寫法cd
而你必需要了解,相對路徑是以你當前所在路徑的相對位置來表示的。舉例來講,你目前在 /home 這個目錄下, 若是想要進入 /var/log 這個目錄時,能夠怎麼寫呢?
cd /var/log (absolute)
cd ../var/log (relative)
由於你在 /home 底下,因此要回到上一層 (../) 以後,才能繼續往 /var 來移動的,特別注意這兩個特殊的目錄:
. :表明當前的目錄,也能夠使用 ./ 來表示;
.. :表明上一層目錄,也能夠 ../ 來表明。
這個 . 與 .. 目錄概念是很重要的,你經常會看到 cd .. 或 ./command 之類的指令下達方式, 就是表明上一層與目前所在目錄的工做狀態。
實例1:如何先進入/var/spool/mail/目錄,再進入到/var/spool/cron/目錄內?
命令:
cd /var/spool/mail
cd ../cron
說明:
由 於/var/spool/mail與/var/spool/cron是一樣在/var/spool/目錄中。如此就不須要在由根目錄開始寫起了。這個相對 路徑是很是有幫助的,尤爲對於某些軟件開發商來講。 通常來講,軟件開發商會將數據放置到/usr/local/裏面的各相對目錄。 但若是用戶想要安裝 到不一樣目錄呢?就得要使用相對路徑。
實例2:網絡文件經常提到相似./run.sh之類的數據,這個指令的意義爲什麼?
說明:
因爲指令的執行須要變量的支持,若你的執行文件放置在本目錄,而且本目錄並不是正規的執行文件目錄(/bin, /usr/bin等爲正規),此時要執行指令就得要嚴格指定該執行檔。./表明本目錄的意思,因此./run.sh表明執行本目錄下, 名爲run.sh的文件。
Linux文件類型和Linux文件的文件名所表明的意義是兩個不一樣的概念。咱們經過通常應用程序而建立的好比file.txt、file.tar.gz ,這些文件雖然要用不一樣的程序來打開,但放在Linux文件類型中衡量的話,大可能是常規文件(也被稱爲普通文件)。
一. 文件類型
Linux文件類型常見的有:普通文件、目錄文件、字符設備文件和塊設備文件、符號連接文件等,如今咱們進行一個簡要的說明。
1. 普通文件
我 們用 ls -lh 來查看某個文件的屬性,能夠看到有相似-rwxrwxrwx,值得注意的是第一個符號是 - ,這樣的文件在Linux中就是普通文 件。這些文件通常是用一些相關的應用程序建立,好比圖像工具、文檔工具、歸檔工具... .... 或 cp工具等。這類文件的刪除方式是用rm 命 令。 另外,依照文件的內容,又大略能夠分爲:
1>. 純文本檔(ASCII):
這是Linux系統中最多的一種文件類型,稱爲純文本檔是由於內容爲咱們人類能夠直接讀到的數據,例如數字、字母等等。 幾乎只要咱們能夠用來作爲設定的文件都屬於這一種文件類型。 舉例來講,你能夠用命令:cat ~/.bashrc來看到該文件的內容。 (cat 是將一個文件內容讀出來的指令).
2>. 二進制文件(binary):
Linux系統其實僅認識且能夠執行二進制文件(binary file)。Linux當中的可執行文件(scripts, 文字型批處理文件不算)就是這種格式的文件。 剛剛使用的命令cat就是一個binary file。
3>. 數據格式文件(data):
有些程序在運做的過程中會讀取某些特定格式的文件,那些特定格式的文件能夠被稱爲數據文件 (data file)。舉例來講,咱們的Linux在使用者登錄時,都會將登陸的數據記錄在 /var/log/wtmp那個文件內,該文件是一個data file,他可以透過last這個指令讀出來! 可是使用cat時,會讀出亂碼~由於他是屬於一種特殊格式的文件?
2. 目錄文件
當 咱們在某個目錄下執行,看到有相似 drwxr-xr-x ,這樣的文件就是目錄,目錄在Linux是一個比較特殊的文件。注意它的第一個字符是d。建立 目錄的命令能夠用 mkdir 命令,或cp命令,cp能夠把一個目錄複製爲另外一個目錄。刪除用rm 或rmdir命令。
3. 字符設備或塊設備文件
如時您進入/dev目錄,列一下文件,會看到相似以下的:
[root@localhost ~]# ls -al /dev/tty
crw-rw-rw- 1 root tty 5, 0 11-03 15:11 /dev/tty
[root@localhost ~]# ls -la /dev/sda1
brw-r----- 1 root disk 8, 1 11-03 07:11 /dev/sda1
咱們看到/dev/tty的屬性是 crw-rw-rw- ,注意前面第一個字符是 c ,這表示字符設備文件。好比貓等串口設備。咱們看到 /dev/sda1 的屬性是 brw-r----- ,注意前面的第一個字符是b,這表示塊設備,好比硬盤,光驅等設備。
這個種類的文件,是用mknode來建立,用rm來刪除。目前在最新的Linux發行版本中,咱們通常不用本身來建立設備文件。由於這些文件是和內核相關聯的。
與系統周邊及儲存等相關的一些文件, 一般都集中在/dev這個目錄之下!一般又分爲兩種:
區塊(block)設備檔 :
就是一些儲存數據, 以提供系統隨機存取的接口設備,舉例來講,硬盤與軟盤等就是啦! 你能夠隨機的在硬盤的不一樣區塊讀寫,這種裝置就是成組設備!你能夠自行查一下/dev/sda看看, 會發現第一個屬性爲[ b ]!
字符(character)設備文件:
亦便是一些串行端口的接口設備, 例如鍵盤、鼠標等等!這些設備的特點就是一次性讀取的,不可以截斷輸出。 舉例來講,你不可能讓鼠標跳到另外一個畫面,而是滑動到另外一個地方!第一個屬性爲 [ c ]。
4. 數據接口文件(sockets):
數據接口文件(或者:套接口文件),這種類型的文件一般被用在網絡上的數據承接了。咱們能夠啓動一個程序來監聽客戶端的要求, 而客戶端就能夠透過這個socket來進行數據的溝通了。第一個屬性爲 [ s ], 最常在/var/run這個目錄中看到這種文件類型了。
例如:當咱們啓動MySQL服務器時,會產生一個mysql.sock的文件。
[root@localhost ~]# ls -lh /var/lib/mysql/mysql.sock
srwxrwxrwx 1 mysql mysql 0 04-19 11:12 /var/lib/mysql/mysql.sock
注意這個文件的屬性的第一個字符是 s。
5. 符號連接文件:
當 咱們查看文件屬性時,會看到有相似 lrwxrwxrwx,注意第一個字符是l,這類文件是連接文件。是經過ln -s 源文件名 新文件名 。上面是一 個例子,表示setup.log是install.log的軟連接文件。怎麼理解呢?這和Windows操做系統中的快捷方式有點類似。
符號連接文件的建立方法舉例:
[root@localhost test]# ls -lh log2012.log
-rw-r--r-- 1 root root 296K 11-13 06:03 log2012.log
[root@localhost test]# ln -s log2012.log linklog.log
[root@localhost test]# ls -lh *.log
lrwxrwxrwx 1 root root 11 11-22 06:58 linklog.log -> log2012.log
-rw-r--r-- 1 root root 296K 11-13 06:03 log2012.log
6. 數據輸送文件(FIFO,pipe):
FIFO也是一種特殊的文件類型,他主要的目的在解決多個程序同時存取一個文件所形成的錯誤問題。 FIFO是first-in-first-out的縮寫。第一個屬性爲[p] 。
二. Linux文件擴展名
1. 擴展名類型
基 本上,Linux的文件是沒有所謂的擴展名的,一個Linux文件能不能被執行,與他的第一欄的十個屬性有關, 與檔名根本一點關係也沒有。這個觀念跟 Windows的狀況不相同喔!在Windows底下, 能被執行的文件擴展名一般是 .com .exe .bat等等,而在Linux底下,只要你的 權限當中具備x的話,例如[ -rwx-r-xr-x ] 即表明這個文件能夠被執行。
過,能夠被執行跟能夠執行成功是不同的~舉例來講,在root家目錄下的install.log 是一個純文本檔,若是經由修改權限成 爲 -rwxrwxrwx 後,這個文件可以真的執行成功嗎? 固然不行~由於他的內容根本就沒有能夠執行的數據。因此說,這個x表明這個文件具備可執行 的能力, 可是能不能執行成功,固然就得要看該文件的內容.
雖然如此,不過咱們仍然但願能夠藉由擴展名來了解該文件是什麼東西,因此,一般咱們仍是會以適當的擴展名來表示該文件是什麼種類的。底下有數種經常使用的擴展名:
*.sh : 腳本或批處理文件 (scripts),由於批處理文件爲使用shell寫成的,因此擴展名就編成 .sh
*Z, *.tar, *.tar.gz, *.zip, *.tgz: 通過打包的壓縮文件。這是由於壓縮軟件分別爲 gunzip, tar 等等的,因爲不一樣的壓縮軟件,而取其相關的擴展名!
*.html, *.php:網頁相關文件,分別表明 HTML 語法與 PHP 語法的網頁文件。.html 的文件可以使用網頁瀏覽器來直接開啓,至於 .php 的文件, 則能夠透過 client 端的瀏覽器來 server 端瀏覽,以獲得運算後的網頁結果。
基本上,Linux系統上的文件名真的只是讓你瞭解該文件可能的用途而已,真正的執行與否仍然須要權限的規範才行。例如雖然有一個文件爲可執行文件,如常見的/bin/ls這個顯示文件屬性的指令,不過,若是這個文件的權限被修改爲沒法執行時,那麼ls就變成不能執行。
上述的這種問題最常發生在文件傳送的過程當中。例如你在網絡上下載一個可執行文件,可是恰恰在你的 Linux系統中就是沒法執行!呵呵!那麼就是可能文件的屬性被改變了。不要懷疑,從網絡上傳送到你的 Linux系統中,文件的屬性與權限確實是會被改變的。
2. Linux文件
長度限制:
在Linux底下,使用預設的Ext2/Ext3文件系統時,針對文件名長度限制爲:
單一文件或目錄的最大允許文件名爲 255 個字符
包含完整路徑名稱及目錄 (/) 之完整檔名爲 4096 個字符
是至關長的檔名!咱們但願Linux的文件名能夠一看就知道該文件在幹嗎的, 因此檔名一般是很長很長。
3. Linux文件名的字符的限制:
因爲Linux在文字接口下的一些指令操做關係,通常來講,你在設定Linux底下的文件名時, 最好能夠避免一些特殊字符比較好!例如底下這些:
* ? > < ; & ! [ ] | \ ' " ` ( ) { }
由於這些符號在文字接口下,是有特殊意義的。另外,文件名的開頭爲小數點「.」時, 表明這個文件爲隱藏文件!同時,因爲指令下達當中,經常會使用到 -option 之類的選項, 因此你最好也避免將文件檔名的開頭以 - 或 + 來命名。
Linux中的目錄
路徑:也就是linux中的目錄(文件夾)有絕對路徑和相對路徑
根目錄:/
用戶主目錄(home directory):位於/home目錄下,用戶登陸時
工做目錄(working directory):當前目錄
當前目錄查看命令:pwd (print working directory)
當前目錄:./
當前目錄的上一級目錄:../或..
返回到上一級目錄:cd ..
進入當前目錄下的dirfile目錄:cd dirfile
cd ~ :進入用戶主目錄(帳號所在目錄) 或者直接cd回車
cd - :(回到先前的目錄
3.查看當前目錄
格式:pwd
功能:pwd (print working directory),查看當前目錄.
經常使用選項說明:
【例】:查看當前目錄
[root@localhost rootfile]# pwd
/home/rootfile
5.顯示目錄內容
格式:ls [選項] [文件目錄]
功能:顯示指定目錄中的文件和了目錄信息,當不指定目錄時,顯示當前目錄下的文件和子目錄信息
經常使用選項說明:
-a 顯示全部文件和子目錄,包括隱藏文件和主目錄
-l 顯示文件和子目錄的詳細信息,包括文件類型、權限、全部者和所屬羣組、文件大小、最後修改時間、文件名
-d 若是參數是目錄,則只顯示目錄信息,而不顯示其中所包含的文件信息
-t 按時間順序顯示
-R 不只顯示指定目錄下的文件和子目錄信息,並且還遞歸地顯示子目錄下的文件和子目錄信息
【例】:
範例一:將目錄下面的文件都列出來(含屬性與隱藏文件)
[root@dsetl tmp]# ls -al
drwx------ 2 fex 602 4096 Jan 9 11:41 keyring-XoSvfl
範例二:完整的顯示文件的修改時間
[root@dsetl tmp]# ls -al --full-time
rwx------ 2 fex 602 4096 2014-01-09 11:41:48.000000000 +0800 .esd-602
建立和查看文件內容
cat命令
cat命令的用途是鏈接文件或標準輸入並打印。這個命令經常使用來顯示文件內容,或者將幾個文件鏈接起來顯示,或者從標準輸入讀取內容並顯示,它常與重定向符號配合使用。
1.命令格式:
cat [選項] [文件]...
2.命令功能:
cat主要有三大功能:
1.一次顯示整個文件:cat filename
2.從鍵盤建立一個文件:cat > filename 只能建立新文件,不能編輯已有文件.
3.將幾個文件合併爲一個文件:cat file1 file2 > file
3.命令參數:
-A, --show-all 等價於 -vET
-b, --number-nonblank 對非空輸出行編號
-e 等價於 -vE
-E, --show-ends 在每行結束處顯示 $
-n, --number 對輸出的全部行編號,由1開始對全部輸出的行數編號
-s, --squeeze-blank 有連續兩行以上的空白行,就代換爲一行的空白行
-t 與 -vT 等價
-T, --show-tabs 將跳格字符顯示爲 ^I
-u (被忽略)
-v, --show-nonprinting 使用 ^ 和 M- 引用,除了 LFD 和 TAB 以外
經常使用選項說明:
【例】:讀取rootfile下Test.java和file中的文件內容
Cd etc
查看/etc/ issue目錄下的內容。
[dsuser@dsetl etc]$ find issue
issue
[dsuser@dsetl etc]$ find *issue*
issue
issue.net
[dsuser@dsetl etc]$ cat issue --查看/etc/ issue目錄下的內容
Red Hat Enterprise Linux Server release 6.4 (Santiago)
Kernel \r on an \m
[dsuser@dsetl etc]$ cat -n issue –顯示行號
1 Red Hat Enterprise Linux Server release 6.4 (Santiago)
2 Kernel \r on an \m
3
[dsuser@dsetl etc]$
cat: invalid option -- 'a'
Try `cat --help' for more information.
[dsuser@dsetl etc]$ cat -A issue
Red Hat Enterprise Linux Server release 6.4 (Santiago)$
Kernel \r on an \m$
【例】:查看內核:
1.[root@dsetl /]# cat /etc/issue
Red Hat Enterprise Linux Server release 6.4 (Santiago)
2.cat /etc/lsb-release
LSB_VERSION=base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch
3.[root@dsetl /]# cat /proc/version
Linux version 2.6.32-358.el6.x86_64 (mockbuild@x86-022.build.eng.bos.redhat.com) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC) ) #1 SMP Tue Jan 29 11:47:41 EST 2013
實例一:把issue1的文件內容加上行號後輸入 issue2這個文件裏
命令:
[root@dsetl lp]# cp /etc/issue .
[root@dsetl lp]# vi issue
[root@dsetl lp]# mv issue issue1
[root@dsetl lp]# vi issue2
[root@dsetl lp]# cat issue1
a
b
c
d
e
f
g
h
i
j
k
l
[root@dsetl lp]# cat issue2
p
q
z
x
v
b
n
n
輸出:
[root@dsetl lp]# cat -n issue1 issue2
1 a
2 b
3 c
4 d
5 e
6 f
7 g
8 h
9 i
10 j
11 k
12 l
13 p
14 q
15 z
16 x
17 v
18 b
19 n
20 n
說明:
實例二:把 issue1和 issue2的文件內容加上行號(空白行不加)以後將內容合併到 issue3 裏。
命令:
[root@dsetl lp]# vi issue1
a
b
c
d
e
f
g
h
i
j
k
[root@dsetl lp]# cat -b issue1 issue2 > issue3
[root@dsetl lp]# cat issue3
1 a
2 b
3 c
4 d
5 e
6 f
7 g
8 h
9 i
10 j
11 k
12 l
13 p
14 q
15 z
16 x
17 v
18 b
19 n
20 n實例三:把 issue1的文件內容加上行號後輸入 issue2這個文件裏
命令:
輸出:
[root@localhost test]# cat issue1
[root@dsetl lp]# cat -n issue1 > issue2
[root@dsetl lp]# cat issue2
a
b
c
d
e
f
g
h
i
j
k
l [root@localhost test]#
Uname:
Uname –a 用來獲取電腦和操做系統的相關信息。
內核名稱,主機名,內核版本號,內核版本,硬件名,處理器類型,硬件平臺類型,操做系統名稱
3.命令參數:
-m或–machine 顯示主機的硬件(CPU)
-n或-nodename 顯示主機在網絡節點上的名稱或主機名稱
-r或–release 顯示linux操做系統內核版本號
-s或–sysname 顯示linux內核名稱
-v 顯示顯示操做系統是第幾個 version 版本
-p 顯示處理器類型或unknown
-i 顯示硬件平臺類型或unknown
-o 顯示操做系統名
–help 得到幫助信息
–version 顯示uname版本信息
實例1:
--依次爲內核名稱,主機名,內核版本號,內核版本,硬件名,處理器類型,硬件平臺類型,操做系統名稱
[root@dsetl /]# uname –a
Linux --顯示內核名稱(Linux)
dsetl --顯示主機在網絡節點上的名稱或主機名稱 (dsetl)
2.6.32-358.el6.x86_64 -顯示主機的硬件(CPU)
(x86_64)
#1 SMP Tue Jan 29 11:47:41 EST 2013 --顯示操做系統是第幾個 version 版本
x86_64 x86_64 x86_64
GNU/Linux --顯示操做系統名 (GNU/Linux)
[root@dsetl /]# uname –r --linux操做系統的內核版本號(2.6.32-358.el6.x86_64)
[root@dsetl /]# uname –o --顯示操做系統名 (GNU/Linux)
[root@dsetl /]# uname –s --顯示內核名稱(Linux)
[root@dsetl /]# uname –m --顯示主機的硬件(CPU)
(x86_64)
[root@dsetl /]# uname –n --顯示主機在網絡節點上的名稱或主機名稱 (dsetl)
[root@dsetl /]# uname –v --顯示操做系統是第幾個 version 版本( #1 SMP Tue Jan 29 11:47:41 EST 2013)
Tac命令:
反向顯示
more命令 翻頁查看
more命令,功能相似 cat ,cat命令是整個文件的內容從上到下顯示在屏幕上。 more會以一頁一頁的顯示方便使用者逐頁閱讀,而最基本的指令就是按空白鍵(space)就往下一頁顯示,按 b 鍵就會往回(back)一頁顯示,並且還有搜尋字串的功能 。more命令從前向後讀取文件,所以在啓動時就加載整個文件。
格式:more [選項] filename
功能:依次讀取filename中的內容,該命令與cat的不一樣是能夠逐屏往下翻頁顯示,按q退出。
經常使用選項說明:
+n 從笫n行開始顯示
-n 定義屏幕大小爲n行
-p 顯示下一屏以前先清屏
-s 文件中連續的空白行壓縮成一個空白行顯示
-l 忽略Ctrl+l(換頁)字符
查看man.config:
命令:More /etc/ man.config
# If no catdir is given, it is assumed to be equal to the mandir
# (so that this dir has both man1 etc. and cat1 etc. subdirs).
# This is the traditional Unix setup.
# Certain versions of the FSSTND recommend putting formatted versions
# of /usr/.../man/manx/page.x into /var/catman/.../catx/page.x.
# The keyword FSSTND will cause this behaviour.
# Certain versions of the FHS recommend putting formatted versions of
# /usr/.../share/man/[locale/]manx/page.x into
# /var/cache/man/.../[locale/]catx/page.x.
# The keyword FHS will cause this behaviour (and overrides FSSTND).
# Explicitly given catdirs override.
#
# FSSTND
FHS
#
# This file is also read by man in order to find how to call nroff, less, etc.
--More--(27%)
(1)空格鍵:表示向下翻一頁
(2)enter鍵表示向下翻一行。
實例1:顯示文件中從第3行起的內容
命令:
more +3 log2012.log
輸出:
[root@localhost test]# cat log2012.log
2012-01
2012-02
2012-03
2012-04-day1
2012-04-day2
2012-04-day3
======[root@localhost test]# more +3 log2012.log
2012-03
2012-04-day1
2012-04-day2
2012-04-day3
======[root@localhost test]#
實例2:從文件中查找第一個出現"day3"字符串的行,並從該處前兩行開始顯示輸出
命令:
more +/day3 log2012.log
輸出:
[root@localhost test]# more +/day3 log2012.log
...skipping
2012-04-day1
2012-04-day2
2012-04-day3
2012-05
2012-05-day1
======[root@localhost test]#
實例3:設定每屏顯示行數
命令:
more -5 log2012.log
輸出:
[root@localhost test]# more -5 log2012.log
2012-01
2012-02
2012-03
2012-04-day1
2012-04-day2
說明:
以下圖所示,最下面顯示了該屏展現的內容佔文件總行數的比例,按 Ctrl+F 或者 空格鍵 將會顯示下一屏5條內容,百分比也會跟着變化。
實例4:列一個目錄下的文件,因爲內容太多,咱們應該學會用more來分頁顯示。這得和管道 | 結合起來
命令:
ls -l | more -5
輸出:
[root@localhost test]# ls -l | more -5
總計 36
-rw-r--r-- 1 root root 308 11-01 16:49 log2012.log
-rw-r--r-- 1 root root 33 10-28 16:54 log2013.log
-rw-r--r-- 1 root root 127 10-28 16:51 log2014.log
lrwxrwxrwx 1 root root 7 10-28 15:18 log_link.log -> log.log
說明:
每頁顯示5個文件信息,按 Ctrl+F 或者 空格鍵 將會顯示下5條文件信息。
less命令 翻頁查看
格式:less [選項] filename
功能:依次讀取filename中的內容,該命令與more的不一樣是不只能夠向下翻頁,還能夠向上翻頁,使用上下鍵、Enter、空格、pageDown、pageUp能夠實現先後翻頁,按q退出。
經常使用選項說明:
命令:less /etc/ man.config
實例2:ps查看進程信息並經過less分頁顯示
命令:
ps -ef |less
輸出:
實例3:查看命令歷史使用記錄並經過less分頁顯示
命令:
history | less
輸出:
[root@localhost test]# history | less
22 scp -r tomcat6.0.32 root@192.168.120.203:/opt/soft
23 cd ..
24 scp -r web root@192.168.120.203:/opt/
25 cd soft
26 ls
27 scp -r jdk1.6.0_16/ root@192.168.120.203:/opt/soft
28 clear
29 vim /etc/profile
30 vim /etc/profile
31 cd tomcat6.0.32/bin/
32 ls
33 ./shutdown.sh
34 ./startup.sh
35 vim startup.sh
36 ls
37 echo $JAVA_HOME
38 java
39 ls
40 ls
41 clear
42 cd /opt
43 ls
44 cp apache-tomcat-6.0.32.tar.gz soft/
45 ls
46 rm -f apache-tomcat-6.0.32.tar.gz
47 ls
48 cd soft
49 ls
50 tar -vzf apache-tomcat-6.0.32.tar.gz
51 tar -vzfx apache-tomcat-6.0.32.tar.gz
52 tar -zxvf apache-tomcat-6.0.32.tar.gz
53 ls
54 cd apache-tomcat-6.0.32
55 ls
56 cd ..
57 mv apache-tomcat-6.0.32 tomcat6.0.32
58 ls
59 cd tomcat6.0.32/
60 ls
實例5:瀏覽多個文件
命令:
Less log2013.log log2014.log
輸出:
說明:
輸入 :n後,切換到 log2014.log
輸入 :p 後,切換到log2013.log
5.附加備註
1.全屏導航
ctrl + F - 向前移動一屏
ctrl + B - 向後移動一屏
ctrl + D - 向前移動半屏
ctrl + U - 向後移動半屏
2.單行導航
j - 向前移動一行
k - 向後移動一行
3.其它導航
G - 移動到最後一行
g - 移動到第一行
q / ZZ - 退出 less 命令zz
4.其它有用的命令
v - 使用配置的編輯器編輯當前文件
h - 顯示 less 的幫助文檔
&pattern - 僅顯示匹配模式的行,而不是整個文件
5.標記導航
當使用 less 查看大文件時,能夠在任何一個位置做標記,能夠經過命令導航到標有特定標記的文本位置:
ma - 使用 a 標記文本的當前位置
'a - 導航到標記 a 處
head命令
格式:head [選項] filename
功能:顯示文件的頭幾行
經常使用選項說明:
-n 顯示文件的前n行,若是沒有n值,默認爲10行
-c<字節> 顯示字節數
命令:Head -2 /etc/ man.config –顯示前兩行
Head –n 2 /etc/ man.config –顯示前兩行
【例】
文件太大,取文件的部分數據:
head -100000 /home/inputfile/data/inputfile/CORE/RUCCDTA/20131231/CORE_SCECA_20131231_INIT.DATA > CORE_SCECA_20131231_INIT.DATA
實例2:顯示文件前n個字節
命令:
head -c 20 log2014.log
輸出:
[root@localhost test]# head -c 20 log2014.log
2014-01
2014-02
2014
[root@localhost test]#
實例3:文件的除了最後n個字節之外的內容
命令:
head -c -32 log2014.log
輸出:
[root@localhost test]# head -c -32 log2014.log
2014-01
2014-02
2014-03
2014-04
2014-05
2014-06
2014-07
2014-08
2014-09
2014-10
2014-11
2014-12[root@localhost test]#
實例4:輸出文件除了最後n行的所有內容
命令:
head -n -6 log2014.log
輸出:
[root@localhost test]# head -n -6 log2014.log
2014-01
2014-02
2014-03
2014-04
2014-05
2014-06
2014-07[root@localhost test]#
>>和>重定向命令:
重定向命令,能夠結合head、ls等使用。
如head -10 file1>file2 :把file1的前10條記錄保存到file2文件。
head -10 file1>>file2 :把file1的前10條記錄追加保存到file2文件。
cat file1 file2>file3 :將file1和file2合併成一個文件file3.
[root@dsetl lp]# head -6 man.config>man.test.config
[root@dsetl lp]# cat man.config > man.test.config
tail 命令從指定點開始將文件寫到標準輸出.使用tail命令的-f選項能夠方便的查閱正在改變的日誌文件,tail -f filename會把filename裏最尾部的內容顯示在屏幕上,而且不但刷新,使你看到最新的文件內容.
格式:tail [選項] filename
2.命令功能:
用於顯示指定文件末尾內容,不指定文件時,做爲輸入信息進行處理。經常使用查看日誌文件。
經常使用選項說明:
+n 從第n行開始顯示
-n 顯示文件的最後n行,若是沒有n值,默認爲最後10行
-f 循環讀取
實例1:顯示文件末尾內容
命令:
tail -n 5 log2014.log
輸出:
[root@localhost test]# tail -n 5 log2014.log
2014-09
2014-10
2014-11
2014-12
==============================[root@localhost test]#
說明:
顯示文件最後5行內容
實例2:循環查看文件內容
命令:
tail -f test.log
輸出:
[root@localhost ~]# ping 192.168.120.204 > test.Log &
[1] 11891[root@localhost ~]# tail -f test.log
PING 192.168.120.204 (192.168.120.204) 56(84) bytes of data.
64 bytes from 192.168.120.204: icmp_seq=1 ttl=64 time=0.038 ms
64 bytes from 192.168.120.204: icmp_seq=2 ttl=64 time=0.036 ms
64 bytes from 192.168.120.204: icmp_seq=3 ttl=64 time=0.033 ms
64 bytes from 192.168.120.204: icmp_seq=4 ttl=64 time=0.027 ms
64 bytes from 192.168.120.204: icmp_seq=5 ttl=64 time=0.032 ms
64 bytes from 192.168.120.204: icmp_seq=6 ttl=64 time=0.026 ms
64 bytes from 192.168.120.204: icmp_seq=7 ttl=64 time=0.030 ms
64 bytes from 192.168.120.204: icmp_seq=8 ttl=64 time=0.029 ms
64 bytes from 192.168.120.204: icmp_seq=9 ttl=64 time=0.044 ms
64 bytes from 192.168.120.204: icmp_seq=10 ttl=64 time=0.033 ms
64 bytes from 192.168.120.204: icmp_seq=11 ttl=64 time=0.027 ms
[root@localhost ~]#
說明:
ping 192.168.120.204 > test.log & //在後臺ping遠程主機。並輸出文件到test.log;這種作法也使用於一個以上的檔案監視。用Ctrl+c來終止。
實例3:從第5行開始顯示文件
命令:
tail -n +5 log2014.log
輸出:
[root@localhost test]# cat log2014.log
2014-01
2014-02
2014-03
2014-04
2014-05
2014-06
2014-07
2014-08
2014-09
2014-10
2014-11
2014-12
==============================
[root@localhost test]# tail -n +5 log2014.log
2014-05
2014-06
2014-07
2014-08
2014-09
2014-10
2014-11
2014-12
==============================
在linux系統中用來計算文件中行號。nl 能夠將輸出的文件內容自動的加上行號!其默認的結果與 cat -n 有點不太同樣, nl 能夠將行號作比較多的顯示設計,包括位數與是否自動補齊 0 等等的功能。
1.命令格式:
nl [選項]... [文件]...
2.命令參數:
-b :指定行號指定的方式,主要有兩種:l
-b a :表示不管是否爲空行,也一樣列出行號(相似 cat -n);
-b t :若是有空行,空的那一行不要列出行號(默認值);
-n :列出行號表示的方法,主要有三種:
-n ln :行號在螢幕的最左方顯示;
-n rn :行號在本身欄位的最右方顯示,且不加 0 ;
-n rz :行號在本身欄位的最右方顯示,且加 0 ;
-w :行號欄位的佔用的位數。
-p 在邏輯定界符處不從新開始計算。
3.命令功能:
nl 命 令讀取 File 參數(缺省狀況下標準輸入),計算輸入中的行號,將計算過的行號寫入標準輸出。 在輸出中,nl 命令根據您在命令行中指定的標誌來計 算左邊的行。 輸入文本必須寫在邏輯頁中。每一個邏輯頁有頭、主體和頁腳節(能夠有空節)。 除非使用 -p 標誌,nl 命令在每一個邏輯頁開始的地方從新 設置行號。 能夠單獨爲頭、主體和頁腳節設置行計算標誌(例如,頭和頁腳行能夠被計算然而文本行不能)。
4.使用實例:
實例一:用 nl 列出 issue3的內容
命令:
nl log2012.log
輸出:
peter@ubuntu:~/lp$ nl issue3
1 1 1
2 2 2
3 3 3
4 4 e
5 5 e
6 6 e
7 7 e
8 8 e:wq
說明:
文件中的空白行,nl 不會加上行號
實例二:用 nl 列出 issue3 的內容,空本行也加上行號
命令:
nl -b a log2012.log
輸出:
[root@localhost test]# nl -ba log2012.log
1 2012-01
2 2012-02
3
4
5 ======[root@localhost test]#
實例3:讓行號前面自動補上0,統一輸出格式
命令:
輸出:
[root@localhost test]# nl -ba -n rz log2014.log
000001 2014-01
000002 2014-02
000003 2014-03
000004 2014-04
000005 2014-05
000006 2014-06
000007 2014-07
000008 2014-08
000009 2014-09
000010 2014-10
000011 2014-11
000012 2014-12
000013 =======
[root@localhost test]# nl -b a -n rz -w 3 log2014.log
001 2014-01
002 2014-02
003 2014-03
004 2014-04
005 2014-05
006 2014-06
007 2014-07
008 2014-08
009 2014-09
010 2014-10
011 2014-11
012 2014-12
013 =======
說明:
nl -b a -n rz 命令行號默認爲六位,要調整位數能夠加上參數 -w 3 調整爲3位。
find文件查找
Linux 下find命令在目錄結構中搜索文件,並執行指定的操做。Linux下find命令提供了至關多的查找條件,功能很強大。因爲find具備強大的功能,所 以它的選項也不少,其中大部分選項都值得咱們花時間來了解一下。即便系統中含有網絡文件系統( NFS),find命令在該文件系統中一樣有效,只你具備 相應的權限。 在運行一個很是消耗資源的find命令時,不少人都傾向於把它放在後臺執行,由於遍歷一個大的文件系統可能會花費很長的時間(這裏是指 30G字節以上的文件系統)。
1.命令格式:
find pathname -options [-print -exec -ok ...]
2.命令功能:
用於在文件樹種查找文件,並做出相應的處理
3.命令參數:
pathname: find命令所查找的目錄路徑。例如用.來表示當前目錄,用/來表示系統根目錄。
-print: find命令將匹配的文件輸出到標準輸出。
-exec: find命令對匹配的文件執行該參數所給出的shell命令。相應命令的形式爲'command' { } \;,注意{ }和\;之間的空格。
-ok: 和-exec的做用相同,只不過以一種更爲安全的模式來執行該參數所給出的shell命令,在執行每個命令以前,都會給出提示,讓用戶來肯定是否執行。
4.命令選項:
-name 按照文件名查找文件。
-perm 按照文件權限來查找文件。
-prune 使用這一選項能夠使find命令不在當前指定的目錄中查找,若是同時使用-depth選項,那麼-prune將被find命令忽略。
-user 按照文件屬主來查找文件。
-group 按照文件所屬的組來查找文件。
-mtime -n +n 按照文件的更改時間來查找文件, - n表示文件更改時間距如今n天之內,+ n表示文件更改時間距如今n天之前。find命令還有-atime和-ctime 選項,但它們都和-m time選項。
-nogroup 查找無有效所屬組的文件,即該文件所屬的組在/etc/groups中不存在。
-nouser 查找無有效屬主的文件,即該文件的屬主在/etc/passwd中不存在。
-newer file1 ! file2 查找更改時間比文件file1新但比文件file2舊的文件。
-type 查找某一類型的文件,諸如:
b - 塊設備文件。
d - 目錄。
c - 字符設備文件。
p - 管道文件。
l - 符號連接文件。
f - 普通文件。
-size n:[c] 查找文件長度爲n塊的文件,帶有c時表示文件長度以字節計。-depth:在查找文件時,首先查找當前目錄中的文件,而後再在其子目錄中查找。
-fstype:查找位於某一類型文件系統中的文件,這些文件系統類型一般能夠在配置文件/etc/fstab中找到,該配置文件中包含了本系統中有關文件系統的信息。
-mount:在查找文件時不跨越文件系統mount點。
-follow:若是find命令遇到符號連接文件,就跟蹤至連接所指向的文件。
-cpio:對匹配的文件使用cpio命令,將這些文件備份到磁帶設備中。
另外,下面三個的區別:
-amin n 查找系統中最後N分鐘訪問的文件
-atime n 查找系統中最後n*24小時訪問的文件
-cmin n 查找系統中最後N分鐘被改變文件狀態的文件
-ctime n 查找系統中最後n*24小時被改變文件狀態的文件
-mmin n 查找系統中最後N分鐘被改變文件數據的文件
-mtime n 查找系統中最後n*24小時被改變文件數據的文件
格式:find [選項] filename
功能:從指定的目錄開始,遞歸地搜索其子目錄,查找知足條件的文件並對之採起相關的操做
經常使用選項說明
-name ‘字串’ 要查找的文件名,能夠用通配符*、?、[]
-group ‘字串’ 文件所屬的用戶組名
-user 文件所屬的用戶名
find命令提供的查詢條件能夠是一個用邏輯符and、or、not組成的複合條件
-a 邏輯與
-o 邏輯或
-! 邏輯非
【例】:將過去系統上24小時內更改過的(mtime)的文件列出
[root@dsetl tmp]# find -mtime 0
解釋:0是表示當前的時間,因此是從如今開始到24小時以前。
[root@dsetl tmp]# find -mtime 1
解釋:1是表示當前的時間,因此是從如今開始到1*24小時以前。
【例】:查找gdm用戶下面的全部文件f
[root@dsetl tmp]# find -user peter
【例】:搜索系統中不屬於任何人的文件
[root@dsetl ~]# find / -nouser
【例】:查找當前目錄下文件名含有font的文件
[root@dsetl etc]# find -name 'font*'
【例】:在根目錄下查找文件名爲’temp’或是匹配’install*’的全部文件
[root@localhost rootfile]# find / -name 'temp' -o -name 'instal*'
/etc/rhgb/temp
/etc/yum/pluginconf.d/installonlyn.conf
/etc/vmware-tools/installer.sh
/software/tomcat5/webapps/docs/appdev/installation.html
/software/tomcat5/temp
/sbin/install-info
/sbin/installkernel
/usr/share/aclocal-1.9/install-sh.m4
/usr/share/icons/Bluecurve/96x96/mimetypes/install.png
/usr/share/icons/Bluecurve/24x24/mimetypes/install.png
/usr/share/icons/Bluecurve/16x16/mimetypes/install.png
/usr/share/icons/Bluecurve/48x48/mimetypes/install.png
/usr/share/aclocal-1.7/install-sh.m4
/usr/share/doc/cyrus-sasl-lib-2.1.22/install.html
/usr/share/doc/sgml-common-0.6.3/html/install-catalog.html
/usr/share/doc/m2crypto-0.16/demo/Zope27/install_dir
/usr/share/doc/m2crypto-0.16/demo/ZopeX3/install_dir
/usr/share/doc/libstdc++-devel-4.1.1/html/install.html
……
【例】:在rootfile下查找不含Test*的文件
[root@localhost rootfile]# find ! -name 'Test*'
.
./.Test2.swp
./1q
./.Test.java.swp
./test2
./test2/file2.txt
./combine.txt
./file.txt
實例1:查找指定時間內訪問過的文件
命令:
find -atime -2
輸出:
[root@peidachang ~]# find -atime -2
.
./logs/monitor
./.bashrc
./.bash_profile
./.bash_history
說明:
超找48小時內訪問過的文件
實例2:根據關鍵字查找
命令:
peter@ubuntu:~/lp$ find -name '*.log'
輸出:
[root@localhost test]# find . -name "*.log"
./log_link.log
./log2014.log
./test4/log3-2.log
./test4/log3-3.log
./test4/log3-1.log
./log2013.log
./log2012.log
./log.log
./test5/log5-2.log
./test5/log5-3.log
./test5/log.log
./test5/log5-1.log
./test5/test3/log3-2.log
./test5/test3/log3-3.log
./test5/test3/log3-1.log
./test3/log3-2.log
./test3/log3-3.log
./test3/log3-1.log
說明:
在當前目錄查找 以.log結尾的文件。 ". "表明當前目錄
實例3:按照目錄或文件的權限來查找文件
命令:
find /opt/soft/test/ -perm 777
輸出:
[root@localhost test]# find /opt/soft/test/ -perm 777
/opt/soft/test/log_link.log
/opt/soft/test/test4
/opt/soft/test/test5/test3
/opt/soft/test/test3
說明:
查找/opt/soft/test/目錄下 權限爲 777的文件
實例4:按類型查找
命令:
find . -type f -name "*.log"
輸出:
[root@localhost test]# find . -type f -name "*.log"
./log2014.log
./test4/log3-2.log
./test4/log3-3.log
./test4/log3-1.log
./log2013.log
./log2012.log
./log.log
./test5/log5-2.log
./test5/log5-3.log
./test5/log.log
./test5/log5-1.log
./test5/test3/log3-2.log
./test5/test3/log3-3.log
./test5/test3/log3-1.log
./test3/log3-2.log
./test3/log3-3.log
./test3/log3-1.log
[root@localhost test]#
說明:
查找當目錄,以.log結尾的普通文件
實例5:查找當前全部目錄並排序
命令:
find . -type d | sort
輸出:
[root@localhost test]# find . -type d | sort
.
./scf
./scf/bin
./scf/doc
./scf/lib
./scf/service
./scf/service/deploy
./scf/service/deploy/info
./scf/service/deploy/product
./test3
./test4
./test5
./test5/test3
[root@localhost test]#
d表示目錄,sort進行排序
實例6:按大小查找文件
命令:
find . -size +1000c -print
輸出:
[root@localhost test]# find . -size +1000c -print
.
./test4
./scf
./scf/lib
./scf/service
./scf/service/deploy
./scf/service/deploy/product
./scf/service/deploy/info
./scf/doc
./scf/bin
./log2012.log
./test5
./test5/test3
./test3
[root@localhost test]#
說明:
查找當前目錄大於1K的文件
find是咱們很經常使用的一個Linux命令,可是咱們通常查找出來的並不只僅是看看而已,還會有進一步的操做,這個時候exec的做用就顯現出來了。
exec解釋:
-exec 參數後面跟的是command命令,它的終止是以;爲結束標誌的,因此這句命令後面的分號是不可缺乏的,考慮到各個系統中分號會有不一樣的意義,因此前面加反斜槓。
{} 花括號表明前面find查找出來的文件名。
使用find時,只要把想要的操做寫在一個文件裏,就能夠用exec來配合find查找,很方便的。在 有些操做系統中只容許-exec選項執行諸如l s或ls -l這樣的命令。大多數用戶使用這一選項是爲了查找舊文件並刪除它們。建議在真正執行rm命令 刪除文件以前,最好先用ls命令看一下,確認它們是所要刪除的文件。 exec選項後面跟隨着所要執行的命令或腳本,而後是一對兒{ },一個空格和一 個\,最後是一個分號。爲了使用exec選項,必需要同時使用print選項。若是驗證一下find命令,會發現該命令只輸出從當前路徑起的相對路徑及文 件名。
實例1:ls -l命令放在find命令的-exec選項中
命令:
find . -type f -exec ls -l {} \;
輸出:
[root@localhost test]# find . -type f -exec ls -l {} \;
-rw-r--r-- 1 root root 127 10-28 16:51 ./log2014.log
-rw-r--r-- 1 root root 0 10-28 14:47 ./test4/log3-2.log
-rw-r--r-- 1 root root 0 10-28 14:47 ./test4/log3-3.log
-rw-r--r-- 1 root root 0 10-28 14:47 ./test4/log3-1.log
-rw-r--r-- 1 root root 33 10-28 16:54 ./log2013.log
-rw-r--r-- 1 root root 302108 11-03 06:19 ./log2012.log
-rw-r--r-- 1 root root 25 10-28 17:02 ./log.log
-rw-r--r-- 1 root root 37 10-28 17:07 ./log.txt
-rw-r--r-- 1 root root 0 10-28 14:47 ./test3/log3-2.log
-rw-r--r-- 1 root root 0 10-28 14:47 ./test3/log3-3.log
-rw-r--r-- 1 root root 0 10-28 14:47 ./test3/log3-1.log
[root@localhost test]#
說明:
上面的例子中,find命令匹配到了當前目錄下的全部普通文件,並在-exec選項中使用ls -l命令將它們列出。
find . -name '*.log' -exec ls -l {} \;
實例2:在目錄中查找更改時間在n日之前的文件並刪除它們
命令:
find . -type f -mtime +14 -exec rm {} \;
輸出:
[root@localhost test]# ll
總計 328
-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log
-rw-r--r-- 1 root root 33 10-28 16:54 log2013.log
-rw-r--r-- 1 root root 127 10-28 16:51 log2014.log
lrwxrwxrwx 1 root root 7 10-28 15:18 log_link.log -> log.log
-rw-r--r-- 1 root root 25 10-28 17:02 log.log
-rw-r--r-- 1 root root 37 10-28 17:07 log.txt
drwxr-xr-x 6 root root 4096 10-27 01:58 scf
drwxrwxrwx 2 root root 4096 10-28 14:47 test3
drwxrwxrwx 2 root root 4096 10-28 14:47 test4
[root@localhost test]# find . -type f -mtime +14 -exec rm {} \;
[root@localhost test]# ll
總計 312
-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log
lrwxrwxrwx 1 root root 7 10-28 15:18 log_link.log -> log.log
drwxr-xr-x 6 root root 4096 10-27 01:58 scf
drwxrwxrwx 2 root root 4096 11-12 19:32 test3
drwxrwxrwx 2 root root 4096 11-12 19:32 test4
[root@localhost test]#
說明:
在shell中用任何方式刪除文件以前,應當先查看相應的文件,必定要當心!當使用諸如mv或rm命令時,能夠使用-exec選項的安全模式。它將在對每一個匹配到的文件進行操做以前提示你。
實例3:在目錄中查找更改時間在n日之前的文件並刪除它們,在刪除以前先給出提示
命令:
find . -name "*.log" -mtime +5 -ok rm {} \;
輸出:
[root@localhost test]# ll
總計 312
-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log
lrwxrwxrwx 1 root root 7 10-28 15:18 log_link.log -> log.log
drwxr-xr-x 6 root root 4096 10-27 01:58 scf
drwxrwxrwx 2 root root 4096 11-12 19:32 test3
drwxrwxrwx 2 root root 4096 11-12 19:32 test4
[root@localhost test]# find . -name "*.log" -mtime +5 -ok rm {} \;
< rm ... ./log_link.log > ? y
< rm ... ./log2012.log > ? n
[root@localhost test]# ll
總計 312
-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log
drwxr-xr-x 6 root root 4096 10-27 01:58 scf
drwxrwxrwx 2 root root 4096 11-12 19:32 test3
drwxrwxrwx 2 root root 4096 11-12 19:32 test4
[root@localhost test]#
說明:
在上面的例子中, find命令在當前目錄中查找全部文件名以.log結尾、更改時間在5日以上的文件,並刪除它們,只不過在刪除以前先給出提示。 按y鍵刪除文件,按n鍵不刪除。
實例4:-exec中使用grep命令
命令:
find /etc -name "passwd*" -exec grep "root" {} \;
輸出:
[root@localhost test]# find /etc -name "passwd*" -exec grep "root" {} \;
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
[root@localhost test]#
說明:
任何形式的命令均可以在-exec選項中使用。 在上面的例子中咱們使用grep命令。find命令首先匹配全部文件名爲「 passwd*」的文件,例如passwd、passwd.old、passwd.bak,而後執行grep命令看看在這些文件中是否存在一個root用戶。
實例5:查找文件移動到指定目錄
命令:
find . -name '*.log' -exec mv {} .. \;
find . -name '*.log' -exec mv {} /home/peter/lp \;
輸出:
[root@localhost test]# ll
總計 12drwxr-xr-x 6 root root 4096 10-27 01:58 scf
drwxrwxr-x 2 root root 4096 11-12 22:49 test3
drwxrwxr-x 2 root root 4096 11-12 19:32 test4
[root@localhost test]# cd test3/
[root@localhost test3]# ll
總計 304
-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log
-rw-r--r-- 1 root root 61 11-12 22:44 log2013.log
-rw-r--r-- 1 root root 0 11-12 22:25 log2014.log
[root@localhost test3]# find . -name '*.log' -exec mv {} .. \;
[root@localhost test3]# ll
總計 0[root@localhost test3]# cd ..
[root@localhost test]# ll
總計 316
-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log
-rw-r--r-- 1 root root 61 11-12 22:44 log2013.log
-rw-r--r-- 1 root root 0 11-12 22:25 log2014.log
drwxr-xr-x 6 root root 4096 10-27 01:58 scf
drwxrwxr-x 2 root root 4096 11-12 22:50 test3
drwxrwxr-x 2 root root 4096 11-12 19:32 test4
[root@localhost test]#
實例6:用exec選項執行cp命令
命令:
find . -name "*.log" -exec cp {} test3 \;
find . -name '*.og' -exec cp {} /home/peter/lp \;
輸出:
[root@localhost test3]# ll
總計 0[root@localhost test3]# cd ..
[root@localhost test]# ll
總計 316
-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log
-rw-r--r-- 1 root root 61 11-12 22:44 log2013.log
-rw-r--r-- 1 root root 0 11-12 22:25 log2014.log
drwxr-xr-x 6 root root 4096 10-27 01:58 scf
drwxrwxr-x 2 root root 4096 11-12 22:50 test3
drwxrwxr-x 2 root root 4096 11-12 19:32 test4
[root@localhost test]# find . -name "*.log" -exec cp {} test3 \;
cp: 「./test3/log2014.log」 及 「test3/log2014.log」 爲同一文件
cp: 「./test3/log2013.log」 及 「test3/log2013.log」 爲同一文件
cp: 「./test3/log2012.log」 及 「test3/log2012.log」 爲同一文件
[root@localhost test]# cd test3
[root@localhost test3]# ll
總計 304
-rw-r--r-- 1 root root 302108 11-12 22:54 log2012.log
-rw-r--r-- 1 root root 61 11-12 22:54 log2013.log
-rw-r--r-- 1 root root 0 11-12 22:54 log2014.log
[root@localhost test3]#
在 使用 find命令的-exec選項處理匹配到的文件時, find命令將全部匹配到的文件一塊兒傳遞給exec執行。但有些系統對可以傳遞給exec的命 令長度有限制,這樣在find命令運行幾分鐘以後,就會出現溢出錯誤。錯誤信息一般是「參數列太長」或「參數列溢出」。這就是xargs命令的用處所在, 特別是與find命令一塊兒使用。
find命令把匹配到的文件傳遞給xargs命令,而xargs命令每次只獲取一部分文件而不是所有,不像-exec選項那樣。這樣它能夠先處理最早獲取的一部分文件,而後是下一批,並如此繼續下去。
在 有些系統中,使用-exec選項會爲處理每個匹配到的文件而發起一個相應的進程,並不是將匹配到的文件所有做爲參數一次執行;這樣在有些狀況下就會出現進 程過多,系統性能降低的問題,於是效率不高; 而使用xargs命令則只有一個進程。另外,在使用xargs命令時,到底是一次獲取全部的參數,仍是分批 取得參數,以及每一次獲取參數的數目都會根據該命令的選項及系統內核中相應的可調參數來肯定。
使用實例:
實例1: 查找系統中的每個普通文件,而後使用xargs命令來測試它們分別屬於哪類文件
命令:
find . -type f -print | xargs file
輸出:
[root@localhost test]# ll
總計 312
-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log
-rw-r--r-- 1 root root 0 11-12 22:25 log2013.log
-rw-r--r-- 1 root root 0 11-12 22:25 log2014.log
drwxr-xr-x 6 root root 4096 10-27 01:58 scf
drwxrwxrwx 2 root root 4096 11-12 19:32 test3
drwxrwxrwx 2 root root 4096 11-12 19:32 test4
[root@localhost test]# find . -type f -print | xargs file
./log2014.log: empty
./log2013.log: empty
./log2012.log: ASCII text
[root@localhost test]#
實例2:在整個系統中查找內存信息轉儲文件(core dump) ,而後把結果保存到/tmp/core.log 文件中
命令:
find / -name "core" -print | xargs echo "" >/tmp/core.log[root@localhost test]# find . -type f -print | xargs file
輸出:
[root@localhost test]# find / -name "core" -print | xargs echo "" >/tmp/core.log
[root@localhost test]# cd /tmp
[root@localhost tmp]# ll
總計 16
-rw-r--r-- 1 root root 1524 11-12 22:29 core.log
drwx------ 2 root root 4096 11-12 22:24 ssh-TzcZDx1766
drwx------ 2 root root 4096 11-12 22:28 ssh-ykiRPk1815
drwx------ 2 root root 4096 11-03 07:11 vmware-root
實例3:在當前目錄下查找全部用戶具備讀、寫和執行權限的文件,並收回相應的寫權限
命令:
find . -perm -7 -print | xargs chmod o-w
輸出:
[root@localhost test]# ll
總計 312
-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log
-rw-r--r-- 1 root root 0 11-12 22:25 log2013.log
-rw-r--r-- 1 root root 0 11-12 22:25 log2014.log
drwxr-xr-x 6 root root 4096 10-27 01:58 scf
drwxrwxrwx 2 root root 4096 11-12 19:32 test3
drwxrwxrwx 2 root root 4096 11-12 19:32 test4
[root@localhost test]# find . -perm -7 -print | xargs chmod o-w
[root@localhost test]# ll
總計 312
-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log
-rw-r--r-- 1 root root 0 11-12 22:25 log2013.log
-rw-r--r-- 1 root root 0 11-12 22:25 log2014.log
drwxr-xr-x 6 root root 4096 10-27 01:58 scf
drwxrwxr-x 2 root root 4096 11-12 19:32 test3
drwxrwxr-x 2 root root 4096 11-12 19:32 test4
[root@localhost test]#
說明:
執行命令後,文件夾scf、test3和test4的權限都發生改變
實例4:用grep命令在全部的普通文件中搜索hostname這個詞
命令:
find . -type f -print | xargs grep "hostname"
輸出:
[root@localhost test]#find . -type f -print | xargs grep 'hostname'
./log2013.log:hostnamebaidu=baidu.com
./log2013.log:hostnamesina=sina.com
./log2013.log:hostnames=true[root@localhost test]#
實例5:用grep命令在當前目錄下的全部普通文件中搜索hostnames這個詞
命令:
find . -name \* -type f -print | xargs grep "hostnames"
輸出:
[root@peida test]# find . -type f -print | xargs grep 'hostnames'
./log2013.log:hostnamesina=sina.com
./log2013.log:hostnames=true[root@localhost test]#
說明:
注意,在上面的例子中, \用來取消find命令中的*在shell中的特殊含義。
實例6:使用xargs執行mv
命令:
find . -name "*.log" | xargs -i mv {} test4
輸出:
[root@localhost test]# ll
總計 316
-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log
-rw-r--r-- 1 root root 61 11-12 22:44 log2013.log
-rw-r--r-- 1 root root 0 11-12 22:25 log2014.log
drwxr-xr-x 6 root root 4096 10-27 01:58 scf
drwxrwxr-x 2 root root 4096 11-12 22:54 test3
drwxrwxr-x 2 root root 4096 11-12 19:32 test4
[root@localhost test]# cd test4/
[root@localhost test4]# ll
總計 0[root@localhost test4]# cd ..
[root@localhost test]# find . -name '*.og' | xargs -i mv {} /home/peter/lp
[root@localhost test]# ll
總計 12drwxr-xr-x 6 root root 4096 10-27 01:58 scf
drwxrwxr-x 2 root root 4096 11-13 05:50 test3
drwxrwxr-x 2 root root 4096 11-13 05:50 test4
[root@localhost test]# cd test4/
[root@localhost test4]# ll
總計 304
-rw-r--r-- 1 root root 302108 11-12 22:54 log2012.log
-rw-r--r-- 1 root root 61 11-12 22:54 log2013.log
-rw-r--r-- 1 root root 0 11-12 22:54 log2014.log
[root@localhost test4]#
實例7:find後執行xargs提示xargs: argument line too long解決方法:
命令:
find . -type f -atime +0 -print0 | xargs -0 -l1 -t rm -f
輸出:
[root@pd test4]# find . -type f -atime +0 -print0 | xargs -0 -l1 -t rm -f
rm -f
[root@pdtest4]#
說明:
-l1是一次處理一個;-t是處理以前打印出命令
實例8:使用-i參數默認的前面輸出用{}代替,-I參數能夠指定其餘代替字符,如例子中的[]
命令:
輸出:
[root@localhost test]# ll
總計 12drwxr-xr-x 6 root root 4096 10-27 01:58 scf
drwxrwxr-x 2 root root 4096 11-13 05:50 test3
drwxrwxr-x 2 root root 4096 11-13 05:50 test4
[root@localhost test]# cd test4
[root@localhost test4]# find . -name "file" | xargs -I [] cp [] ..
[root@localhost test4]# ll
總計 304
-rw-r--r-- 1 root root 302108 11-12 22:54 log2012.log
-rw-r--r-- 1 root root 61 11-12 22:54 log2013.log
-rw-r--r-- 1 root root 0 11-12 22:54 log2014.log
[root@localhost test4]# cd ..
[root@localhost test]# ll
總計 316
-rw-r--r-- 1 root root 302108 11-13 06:03 log2012.log
-rw-r--r-- 1 root root 61 11-13 06:03 log2013.log
-rw-r--r-- 1 root root 0 11-13 06:03 log2014.log
drwxr-xr-x 6 root root 4096 10-27 01:58 scf
drwxrwxr-x 2 root root 4096 11-13 05:50 test3
drwxrwxr-x 2 root root 4096 11-13 05:50 test4
[root@localhost test]#
說明:
使用-i參數默認的前面輸出用{}代替,-I參數能夠指定其餘代替字符,如例子中的[]
實例9:xargs的-p參數的使用
命令:
find . -name "*.log" | xargs -p -i mv {} ..
輸出:
[root@localhost test3]# ll
總計 0
-rw-r--r-- 1 root root 0 11-13 06:06 log2015.log
[root@localhost test3]# cd ..
[root@localhost test]# ll
總計 316
-rw-r--r-- 1 root root 302108 11-13 06:03 log2012.log
-rw-r--r-- 1 root root 61 11-13 06:03 log2013.log
-rw-r--r-- 1 root root 0 11-13 06:03 log2014.log
drwxr-xr-x 6 root root 4096 10-27 01:58 scf
drwxrwxr-x 2 root root 4096 11-13 06:06 test3
drwxrwxr-x 2 root root 4096 11-13 05:50 test4
[root@localhost test]# cd test3
[root@localhost test3]# find . -name "*.log" | xargs -p -i mv {} ..
mv ./log2015.log .. ?...y
[root@localhost test3]# ll
總計 0[root@localhost test3]# cd ..
[root@localhost test]# ll
總計 316
-rw-r--r-- 1 root root 302108 11-13 06:03 log2012.log
-rw-r--r-- 1 root root 61 11-13 06:03 log2013.log
-rw-r--r-- 1 root root 0 11-13 06:03 log2014.log
-rw-r--r-- 1 root root 0 11-13 06:06 log2015.log
drwxr-xr-x 6 root root 4096 10-27 01:58 scf
drwxrwxr-x 2 root root 4096 11-13 06:08 test3
drwxrwxr-x 2 root root 4096 11-13 05:50 test4
[root@localhost test]#
說明:
-p參數會提示讓你確認是否執行後面的命令,y執行,n不執行。
find一些經常使用參數的一些經常使用實例和一些具體用法和注意事項。
1.使用name選項:
文 件名選項是find命令最經常使用的選項,要麼單獨使用該選項,要麼和其餘選項一塊兒使用。 能夠使用某種文件名模式來匹配文件,記住要用引號將文件名模式引 起來。 無論當前路徑是什麼,若是想要在本身的根目錄$HOME中查找文件名符合*.log的文件,使用~做爲 'pathname'參數,波浪號~代 表了你的$HOME目錄。
find ~ -name "*.log" -print
想要在當前目錄及子目錄中查找全部的‘ *.log‘文件,能夠用:
find . -name "*.log" -print
想要的當前目錄及子目錄中查找文件名以一個大寫字母開頭的文件,能夠用:
find . -name "[A-Z]*" -print
想要在/etc目錄中查找文件名以host開頭的文件,能夠用:
find /etc -name "host*" -print
想要查找$HOME目錄中的文件,能夠用:
find ~ -name "*" -print 或find . -print
要想讓系統高負荷運行,就從根目錄開始查找全部的文件。
find / -name "*" -print
若是想在當前目錄查找文件名以一個個小寫字母開頭,最後是4到9加上.log結束的文件:
命令:
find . -name "[a-z]*[4-9].log" -print
輸出:
[root@localhost test]# ll
總計 316
-rw-r--r-- 1 root root 302108 11-13 06:03 log2012.log
-rw-r--r-- 1 root root 61 11-13 06:03 log2013.log
-rw-r--r-- 1 root root 0 11-13 06:03 log2014.log
-rw-r--r-- 1 root root 0 11-13 06:06 log2015.log
drwxr-xr-x 6 root root 4096 10-27 01:58 scf
drwxrwxr-x 2 root root 4096 11-13 06:08 test3
drwxrwxr-x 2 root root 4096 11-13 05:50 test4
[root@localhost test]# find . -name "[a-z]*[4-9].log" -print
./log2014.log
./log2015.log
./test4/log2014.log
[root@localhost test]#
2.用perm選項:
按照文件權限模式用-perm選項,按文件權限模式來查找文件的話。最好使用八進制的權限表示法。
如在當前目錄下查找文件權限位爲755的文件,即文件屬主能夠讀、寫、執行,其餘用戶能夠讀、執行的文件,能夠用:
[root@localhost test]# find . -perm 755 -print
.
./scf
./scf/lib
./scf/service
./scf/service/deploy
./scf/service/deploy/product
./scf/service/deploy/info
./scf/doc
./scf/bin
[root@localhost test]#
還有一種表達方法:在八進制數字前面要加一個橫槓-,表示都匹配,如-007就至關於777,-005至關於555,
命令:
find . -perm -005
輸出:
[root@localhost test]# ll
總計 316
-rw-r--r-- 1 root root 302108 11-13 06:03 log2012.log
-rw-r--r-- 1 root root 61 11-13 06:03 log2013.log
-rw-r--r-- 1 root root 0 11-13 06:03 log2014.log
-rw-r--r-- 1 root root 0 11-13 06:06 log2015.log
drwxr-xr-x 6 root root 4096 10-27 01:58 scf
drwxrwxr-x 2 root root 4096 11-13 06:08 test3
drwxrwxr-x 2 root root 4096 11-13 05:50 test4
[root@localhost test]# find . -perm -005
.
./test4
./scf
./scf/lib
./scf/service
./scf/service/deploy
./scf/service/deploy/product
./scf/service/deploy/info
./scf/doc
./scf/bin
./test3
[root@localhost test]#
3.忽略某個目錄:
如 果在查找文件時但願忽略某個目錄,由於你知道那個目錄中沒有你所要查找的文件,那麼能夠使用-prune選項來指出須要忽略的目錄。在使用-prune選 項時要小心,由於若是你同時使用了-depth選項,那麼-prune選項就會被find命令忽略。若是但願在test目錄下查找文件,但不但願在 test/test3目錄下查找,能夠用:
命令:
find test -path "test/test3" -prune -o -print
輸出:
[root@localhost soft]# find test -path "test/test3" -prune -o -print
test
test/log2014.log
test/log2015.log
test/test4
test/test4/log2014.log
test/test4/log2013.log
test/test4/log2012.log
test/scf
test/scf/lib
test/scf/service
test/scf/service/deploy
test/scf/service/deploy/product
test/scf/service/deploy/info
test/scf/doc
test/scf/bin
test/log2013.log
test/log2012.log
[root@localhost soft]#
4.使用find查找文件的時候怎麼避開某個文件目錄:
實例1:在 lp 目錄下查找不在lp1 子目錄以內的全部文件
命令:
find lp -path 'lp/lp1' -o -print
輸出:
[root@localhost soft]# find lp
lp
lp/ test.Log
lp/issue2
lp/test2.log
lp/lp1
lp/lp1/lp
lp/log2013.log
lp/manpath.config
lp/log2123.log
lp/!
lp/lp2312.log
lp/issue3
lp/lp23323.log
lp/test.log
lp/issue1
lp/lp2012.log
lp/lp123.log
lp/lp
lp/lp201233.og
lp/ test.Log
lp/issue4
[root@localhost soft]# find lp -path 'lp/lp1' -prune -o -print
lp
lp/ test.Log
lp/issue2
lp/test2.log
lp/log2013.log
lp/manpath.config
lp/log2123.log
lp/!
lp/lp2312.log
lp/issue3
lp/lp23323.log
lp/test.log
lp/issue1
lp/lp2012.log
lp/lp123.log
lp/lp
lp/lp201233.og
lp/ test.Log
lp/issue4
說明:
find [-path ..] [expression]
在路徑列表的後面的是表達式
-path "test" -prune -o -print 是 -path "test" -a -prune -o -print 的簡寫表達式按順序求值, -a 和 -o 都是短路求值,與 shell 的 && 和 || 相似若是
-path "test" 爲 真,則求值 -prune , -prune 返回真,與邏輯表達式爲真;不然不求值 -prune,與邏輯表達式爲假。如 果 -path "test" -a -prune 爲假,則求值 -print ,-print返回真,或邏輯表達式爲真;不然不求值 -print, 或邏輯表達式爲真。
這個表達式組合特例能夠用僞碼寫爲:
if -path "test" then
-prune
else
實例2:避開多個文件夾:
命令:
find test \( -path test/test4 -o -path test/test3 \) -prune -o -print
輸出:
[root@localhost soft]# find test \( -path test/test4 -o -path test/test3 \) -prune -o -print
test
test/log2014.log
test/log2015.log
test/scf
test/scf/lib
test/scf/service
test/scf/service/deploy
test/scf/service/deploy/product
test/scf/service/deploy/info
test/scf/doc
test/scf/bin
test/log2013.log
test/log2012.log
[root@localhost soft]#
說明:
圓括號表示表達式的結合。 \ 表示引用,即指示 shell 不對後面的字符做特殊解釋,而留給 find 命令去解釋其意義。
實例3:查找某一肯定文件,-name等選項加在-o 以後
命令:
find test \(-path test/test4 -o -path test/test3 \) -prune -o -name "*.log" -print
輸出:
[root@localhost soft]# find test \( -path test/test4 -o -path test/test3 \) -prune -o -name "*.log" -print
test/log2014.log
test/log2015.log
test/log2013.log
test/log2012.log
[root@localhost soft]#
5.使用user和nouser選項:
按文件屬主查找文件:
實例1:在$HOME目錄中查找文件屬主爲peida的文件
命令:
find ~ -user peida -print
實例2:在/etc目錄下查找文件屬主爲peida的文件:
命令:
find /home/peter/lp -user peter -print
說明:
實例3:爲了查找屬主賬戶已經被刪除的文件,能夠使用-nouser選項。在/home目錄下查找全部的這類文件
命令:
find /home -nouser -print
說明:
這樣就可以找到那些屬主在/etc/passwd文件中沒有有效賬戶的文件。在使用-nouser選項時,沒必要給出用戶名; find命令可以爲你完成相應的工做。
6.使用group和nogroup選項:
就像user和nouser選項同樣,針對文件所屬於的用戶組, find命令也具備一樣的選項,爲了在/apps目錄下查找屬於gem用戶組的文件,能夠用:
find /home/peter/lp -group peter -print
要查找沒有有效所屬用戶組的全部文件,能夠使用nogroup選項。下面的find命令從文件系統的根目錄處查找這樣的文件:
find / -nogroup-print
7.按照更改時間或訪問時間等查找文件:
若是但願按照更改時間來查找文件,能夠使用mtime,atime或ctime選項。若是系統忽然沒有可用空間了,頗有可能某一個文件的長度在此期間增加迅速,這時就能夠用mtime選項來查找這樣的文件。
用減號-來限定更改時間在距今n日之內的文件,而用加號+來限定更改時間在距今n日之前的文件。
但願在系統根目錄下查找更改時間在5日之內的文件,能夠用:
find / -mtime -5 -print
爲了在/var/adm目錄下查找更改時間在3日之前的文件,能夠用:
find /var/adm -mtime +3 -print
8.查找比某個文件新或舊的文件:
若是但願查找更改時間比某個文件新但比另外一個文件舊的全部文件,能夠使用-newer選項。
它的通常形式爲:
newest_file_name ! oldest_file_name
其中,!是邏輯非符號。
實例1:查找更改時間比文件log2012.log新但比文件log2017.log舊的文件
命令:
find -newer log2012.log ! -newer log2017.log
輸出:
[root@localhost test]# ll
總計 316
-rw-r--r-- 1 root root 302108 11-13 06:03 log2012.log
-rw-r--r-- 1 root root 61 11-13 06:03 log2013.log
-rw-r--r-- 1 root root 0 11-13 06:03 log2014.log
-rw-r--r-- 1 root root 0 11-13 06:06 log2015.log
-rw-r--r-- 1 root root 0 11-16 14:41 log2016.log
-rw-r--r-- 1 root root 0 11-16 14:43 log2017.log
drwxr-xr-x 6 root root 4096 10-27 01:58 scf
drwxrwxr-x 2 root root 4096 11-13 06:08 test3
drwxrwxr-x 2 root root 4096 11-13 05:50 test4
[root@localhost test]# find -newer log2012.log ! -newer log2017.log
.
./log2015.log
./log2017.log
./log2016.log
./test3
[root@localhost test]#
實例2:查找更改時間在比log2012.log文件新的文件(更改時間更靠後)
命令:
find . -newer log2012.log -print
輸出:
[root@localhost test]# find -newer log2012.log
.
./log2015.log
./log2017.log
./log2016.log
./test3
[root@localhost test]#
9.使用type選項:
實例1:在/etc目錄下查找全部的目錄
命令:
find /etc -type d -print
實例2:在當前目錄下查找除目錄之外的全部類型的文件
命令:
find . ! -type d -print
實例3:在/etc目錄下查找全部的符號連接文件
命令:
find /etc -type l -print
10.使用size選項:
能夠按照文件長度來查找文件,這裏所指的文件長度既能夠用塊(block)來計量,也能夠用字節來計量。以字節計量文件長度的表達形式爲N c;以塊計量文件長度只用數字表示便可。
在按照文件長度查找文件時,通常使用這種以字節表示的文件長度,在查看文件系統的大小,由於這時使用塊來計量更容易轉換。
實例1:在當前目錄下查找文件長度大於1 M字節的文件
命令:
find . -size +1000000c -print
實例2:在/home/apache目錄下查找文件長度剛好爲100字節的文件:
命令:
find /home/apache -size 100c -print
實例3:在當前目錄下查找長度超過10塊的文件(一塊等於512字節)
命令:
find . -size +10 -print
11.使用depth選項:
在使用find命令時,可能但願先匹配全部的文件,再在子目錄中查找。使用depth選項就能夠使find命令這樣作。這樣作的一個緣由就是,當在使用find命令向磁帶上備份文件系統時,但願首先備份全部的文件,其次再備份子目錄中的文件。
實例1:find命令從文件系統的根目錄開始,查找一個名爲CON.FILE的文件。
命令:
find / -name "CON.FILE" -depth -print
說明:
它將首先匹配全部的文件而後再進入子目錄中查找
12.使用mount選項:
在當前的文件系統中查找文件(不進入其餘文件系統),能夠使用find命令的mount選項。
實例1:從當前目錄開始查找位於本文件系統中文件名以XC結尾的文件
命令:
find . -name "*.XC" -mount -print
格式:wc [選項] filename
功能:統計文件的字節數、字數、行數
經常使用選項說明:
-c 統計字節數
-l 統計行數
-w 統計字數
4.使用實例:
實例1:查看文件的字節數、字數、行數
命令:
wc test.txt
輸出:
[root@localhost test]# cat test.txt
hnlinux
peida.cnblogs.com
ubuntu
ubuntu linux
redhat
Redhat
linuxmint
[root@localhost test]# wc test.txt
7 8 70 test.txt
[root@localhost test]# wc -l test.txt --統計行數
7 test.txt
[root@localhost test]# wc -c test.txt --統計字節數
70 test.txt
[root@localhost test]# wc -w test.txt --統計字數
8 test.txt
[root@localhost test]# wc -m test.txt
70 test.txt
[root@localhost test]# wc -L test.txt
17 test.txt
說明:
7 8 70 test.txt
行數 單詞數 字節數 文件名
實例2:用wc命令怎麼作到只打印統計數字不打印文件名
命令:
輸出:
peter@ubuntu:~/lp$ wc -l issue2
6 issue2
[root@localhost test]#cat issue2 | wc -l
7[root@localhost test]# 6
說明:
使用管道線,這在編寫shell腳本時特別有用。
實例3:用來統計當前目錄下的文件數
命令:
ls -l | wc -l
輸出:
[root@localhost test]# cd test6
[root@localhost test6]# ll
總計 604
---xr--r-- 1 root mail 302108 11-30 08:39 linklog.log
---xr--r-- 1 mail users 302108 11-30 08:39 log2012.log
-rw-r--r-- 1 mail users 61 11-30 08:39 log2013.log
-rw-r--r-- 1 root mail 0 11-30 08:39 log2014.log
-rw-r--r-- 1 root mail 0 11-30 08:39 log2015.log
-rw-r--r-- 1 root mail 0 11-30 08:39 log2016.log
-rw-r--r-- 1 root mail 0 11-30 08:39 log2017.log
[root@localhost test6]# ls -l | wc -l
8
[root@localhost test6]#
說明:
數量中包含當前目錄
們常常在linux要查找某個文件,但不知道放在哪裏了,能夠使用下面的一些命令來搜索:
which 查看可執行文件的位置。
whereis 查看文件的位置。
locate 配合數據庫查看文件位置。
find 實際搜尋硬盤查詢文件名稱。
which命令的做用是,在PATH變量指定的路徑中,搜索某個系統命令的位置,而且返回第一個搜索結果。也就是說,使用which命令,就能夠看到某個系統命令是否存在,以及執行的究竟是哪個位置的命令。
1.命令格式:
which 可執行文件名稱
2.命令功能:
which指令會在PATH變量指定的路徑中,搜索某個系統命令的位置,而且返回第一個搜索結果。
3.命令參數:
-n 指定文件名長度,指定的長度必須大於或等於全部文件中最長的文件名。
-p 與-n參數相同,但此處的包括了文件的路徑。
-w 指定輸出時欄位的寬度。
-V 顯示版本信息
4.使用實例:
實例1:查找文件、顯示命令路徑
命令:
which lsmod
輸出:
[root@localhost ~]# which pwd
/bin/pwd
[root@localhost ~]# which adduser
/usr/sbin/adduser
[root@localhost ~]#
說明:
which 是根據使用者所配置的 PATH 變量內的目錄去搜尋可運行檔的!因此,不一樣的 PATH 配置內容所找到的命令固然不同的!
實例2:用 which 去找出 which
命令:
輸出:
[root@localhost ~]# which which
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
/usr/bin/which
[root@localhost ~]#
說明:
居然會有兩個 which ,其中一個是 alias 這就是所謂的『命令別名』,意思是輸入 which 會等於後面接的那串命令!
實例3:找出 cd 這個命令
命令:
which cd
輸出:
說明:
cd 這個經常使用的命令居然找不到啊!爲何呢?這是由於 cd 是bash 內建的命令! 可是 which 默認是找 PATH 內所規範的目錄,因此固然必定找不到的!
whereis命令只能用於程序名的搜索,並且只搜索二進制文件(參數-b)、man說明文件(參數-m)和源代碼文件(參數-s)。若是省略參數,則返回全部信息。
和 find相比,whereis查找的速度很是快,這是由於linux系統會將 系統內的全部文件都記錄在一個數據庫文件中,當使用whereis和下面即 將介紹的locate時,會從數據庫中查找數據,而不是像find命令那樣,通 過遍歷硬盤來查找,效率天然會很高。
可是該數據庫文件並非實時更新,默認狀況下時一星期更新一次,所以,咱們在用whereis和locate 查找文件時,有時會找到已經被刪除的數據,或者剛剛創建文件,卻沒法查找到,緣由就是由於數據庫文件沒有被更新。
1.命令格式:
whereis [-bmsu] [BMS 目錄名 -f ] 文件名
2.命令功能:
whereis命令是定位可執行文件、源代碼文件、幫助文件在文件系統中的位置。這些文件的屬性應屬於原始代碼,二進制文件,或是幫助文件。whereis 程序還具備搜索源代碼、指定備用搜索路徑和搜索不尋常項的能力。
3.命令參數:
-b 定位可執行文件。
-m 定位幫助文件。
-s 定位源代碼文件。
-u 搜索默認路徑下除可執行文件、源代碼文件、幫助文件之外的其它文件。
-B 指定搜索可執行文件的路徑。
-M 指定搜索幫助文件的路徑。
-S 指定搜索源代碼文件的路徑。
4.使用實例:
實例1:將和**文件相關的文件都查找出來
命令:
whereis svn
輸出:
[root@localhost ~]# whereis tomcat
tomcat:
[root@localhost ~]# whereis svn
svn: /usr/bin/svn /usr/local/svn /usr/share/man/man1/svn.1.gz
說明:
tomcat沒安裝,找不出來,svn安裝找出了不少相關文件
實例2:只將二進制文件 查找出來
命令:
whereis -b svn
輸出:
[root@localhost ~]# whereis -b svn
svn: /usr/bin/svn /usr/local/svn
[root@localhost ~]# whereis -m svn
svn: /usr/share/man/man1/svn.1.gz
[root@localhost ~]# whereis -s svn
svn:
[root@localhost ~]#
說明:
whereis -m svn查出說明文檔路徑,whereis -s svn 找source源文件。
locate 讓使用者能夠很快速的搜尋檔案系統內是否有指定的檔案。其方法是先創建一個包括系統內全部檔案名稱及路徑的數據庫,以後當尋找時就只需查詢這個數據庫,而沒必要實際深刻檔案系統之中了。在通常的 distribution 之中,數據庫的創建都被放在 crontab 中自動執行。
1.命令格式:
Locate [選擇參數] [樣式]
2.命令功能:
locate 命令能夠在搜尋數據庫時快速找到檔案,數據庫由updatedb程序來更新,updatedb是由cron daemon週期性創建的,locate命令 在搜尋數據庫時比由整個由硬盤資料來搜尋資料來得快,但較差勁的是locate所找到的檔案如果最近才創建或 剛改名的,可能會找不到,在內定值 中,updatedb天天會跑一次,能夠由修改crontab來更新設定值。(etc/crontab)
locate 指定用在搜尋符合條件的檔案,它會去儲存檔案與目錄名稱的數據庫內,尋找合乎範本樣式條件的檔案或目錄錄,能夠使用特殊字元(如」*」 或」?」等)來指 定範本樣式,如指定範本爲kcpa*ner, locate會找出全部起始字串爲kcpa且結尾爲ner的檔案或目錄,如名稱爲kcpartner若目錄 錄名稱爲kcpa_ner則會列出該目錄下包括 子目錄在內的全部檔案。
locate 指令和find找尋檔案的功能相似,但locate是透過update程序將硬盤中的全部檔案和目錄資料先創建一個索引數據庫,在 執行loacte時直 接找該索引,查詢速度會較快,索引數據庫通常是由操做系統管理,但也能夠直接下達update強迫系統當即修改索引數據庫。
3.命令參數:
-e 將排除在尋找的範圍以外。
-1 若是 是 1.則啓動安全模式。在安全模式下,使用者不會看到權限沒法看到 的檔案。這會始速度減慢,由於 locate 必須至實際的檔案系統中取得檔案的 權限資料。
-f 將特定的檔案系統排除在外,例如咱們沒有到理要把 proc 檔案系統中的檔案 放在資料庫中。
-q 安靜模式,不會顯示任何錯誤訊息。
-n 至多顯示 n個輸出。
-r 使用正規運算式 作尋找的條件。
-o 指定資料庫存的名稱。
-d 指定資料庫的路徑
-h 顯示輔助訊息
-V 顯示程式的版本訊息
4.使用實例:
實例1:查找和pwd相關的全部文件
命令:
locate pwd
輸出:
peida-VirtualBox ~ # locate pwd
/bin/pwd
/etc/.pwd.lock
/sbin/unix_chkpwd
/usr/bin/pwdx
/usr/include/pwd.h
/usr/lib/python2.7/dist-packages/twisted/python/fakepwd.py
/usr/lib/python2.7/dist-packages/twisted/python/fakepwd.pyc
/usr/lib/python2.7/dist-packages/twisted/python/test/test_fakepwd.py
/usr/lib/python2.7/dist-packages/twisted/python/test/test_fakepwd.pyc
/usr/lib/syslinux/pwd.c32
/usr/share/help/C/empathy/irc-join-pwd.page
/usr/share/help/ca/empathy/irc-join-pwd.page
/usr/share/help/cs/empathy/irc-join-pwd.page
/usr/share/help/de/empathy/irc-join-pwd.page
/usr/share/help/el/empathy/irc-join-pwd.page
實例2: 搜索etc目錄下全部以sh開頭的文件
命令:
locate /etc/sh
輸出:
peida-VirtualBox ~ # locate /etc/sh
/etc/shadowl
/etc/shadow-
/etc/shells
peida-VirtualBox ~ #
實例3:搜索etc目錄下,全部以m開頭的文件
命令:
locate /etc/m
輸出:
peida-VirtualBox ~ # locate /etc/m
/etc/magic
/etc/magic.mime
/etc/mailcap
/etc/mailcap.order
/etc/manpath.config
/etc/mate-settings-daemon
Linux系統中grep命令是一種強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹 配的行打印出來。grep全稱是Global Regular Expression Print,表示全局正則表達式版本,它的使用權限是全部用戶。
grep的工做方式是這樣的,它在一個或多個文件中搜索字符串模板。若是模板包括空格,則必須被引用,模板後的全部字符串被看做文件名。搜索的結果被送到標準輸出,不影響原文件內容。
grep可用於shell腳本,由於grep經過返回一個狀態值來講明搜索的狀態,若是模板搜索成功,則返回0,若是搜索不成功,則返回1,若是搜索的文件不存在,則返回2。咱們利用這些返回值就可進行一些自動化的文本處理工做。
1.命令格式:
grep [option] pattern file
2.命令功能:
用於過濾/搜索的特定字符。可以使用正則表達式能多種命令配合使用,使用上十分靈活。
3.命令參數:
-a --text #不要忽略二進制的數據。
-A<顯示行數> --after-context=<顯示行數> #除了顯示符合範本樣式的那一列以外,並顯示該行以後的內容。
-b --byte-offset #在顯示符合樣式的那一行以前,標示出該行第一個字符的編號。
-B<顯示行數> --before-context=<顯示行數> #除了顯示符合樣式的那一行以外,並顯示該行以前的內容。
-c --count #計算符合樣式的列數。
-C<顯示行數> --context=<顯示行數>或-<顯示行數> #除了顯示符合樣式的那一行以外,並顯示該行以前後的內容。
-d <動做> --directories=<動做> #當指定要查找的是目錄而非文件時,必須使用這項參數,不然grep指令將回報信息並中止動做。
-e<範本樣式> --regexp=<範本樣式> #指定字符串作爲查找文件內容的樣式。
-E --extended-regexp #將樣式爲延伸的普通表示法來使用。
-f<規則文件> --file=<規則文件> #指定規則文件,其內容含有一個或多個規則樣式,讓grep查找符合規則條件的文件內容,格式爲每行一個規則樣式。
-F --fixed-regexp #將樣式視爲固定字符串的列表。
-G --basic-regexp #將樣式視爲普通的表示法來使用。
-h --no-filename #在顯示符合樣式的那一行以前,不標示該行所屬的文件名稱。
-H --with-filename #在顯示符合樣式的那一行以前,表示該行所屬的文件名稱。
-i --ignore-case #忽略字符大小寫的差異。
-l --file-with-matches #列出文件內容符合指定的樣式的文件名稱。
-L --files-without-match #列出文件內容不符合指定的樣式的文件名稱。
-n --line-number #在顯示符合樣式的那一行以前,標示出該行的列數編號。
-q --quiet或--silent #不顯示任何信息。
-r --recursive #此參數的效果和指定「-d recurse」參數相同。
-s --no-messages #不顯示錯誤信息。
-v --revert-match #顯示不包含匹配文本的全部行。
-V --version #顯示版本信息。
-x --line-regexp #只顯示全列符合的列。
-y #此參數的效果和指定「-i」參數相同。
4.規則表達式:
grep的規則表達式:
^ #錨定行的開始 如:'^grep'匹配全部以grep開頭的行。
$ #錨定行的結束 如:'grep$'匹配全部以grep結尾的行。
. #匹配一個非換行符的字符 如:'gr.p'匹配gr後接一個任意字符,而後是p。
* #匹配零個或多個先前字符 如:'*grep'匹配全部一個或多個空格後緊跟grep的行。
.* #一塊兒用表明任意字符。
[] #匹配一個指定範圍內的字符,如'[Gg]rep'匹配Grep和grep。
[^] #匹配一個不在指定範圍內的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一個字母開頭,緊跟rep的行。
\(..\) #標記匹配字符,如'\(love\)',love被標記爲1。
\< #錨定單詞的開始,如:'\<grep'匹配包含以grep開頭的單詞的行。
\> #錨定單詞的結束,如'grep\>'匹配包含以grep結尾的單詞的行。
x\{m\} #重複字符x,m次,如:'0\{5\}'匹配包含5個o的行。
x\{m,\} #重複字符x,至少m次,如:'o\{5,\}'匹配至少有5個o的行。
x\{m,n\} #重複字符x,至少m次,很少於n次,如:'o\{5,10\}'匹配5--10個o的行。
\w #匹配文字和數字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G後跟零個或多個文字或數字字符,而後是p。
\W #\w的反置形式,匹配一個或多個非單詞字符,如點號句號等。
\b #單詞鎖定符,如: '\bgrep\b'只匹配grep。
POSIX字符:
爲 了在不一樣國家的字符編碼中保持一至,POSIX(The Portable Operating System Interface)增長了特殊的字符 類,如[:alnum:]是[A-Za-z0-9]的另外一個寫法。要把它們放到[]號內才能成爲正則表達式,如[A- Za-z0-9]或 [[:alnum:]]。在linux下的grep除fgrep外,都支持POSIX的字符類。
[:alnum:] #文字數字字符
[:alpha:] #文字字符
[:digit:] #數字字符
[:graph:] #非空字符(非空格、控制字符)
[:lower:] #小寫字符
[:cntrl:] #控制字符
[:print:] #非空字符(包括空格)
[:punct:] #標點符號
[:space:] #全部空白字符(新行,空格,製表符)
[:upper:] #大寫字符
[:xdigit:] #十六進制數字(0-9,a-f,A-F)
5.使用實例:
實例1:查找指定進程
命令:
ps -ef|grep svn
輸出:
[root@localhost ~]# ps -ef|grep svn
root 4943 1 0 Dec05 ? 00:00:00 svnserve -d -r /opt/svndata/grape/
root 16867 16838 0 19:53 pts/0 00:00:00 grep svn
[root@localhost ~]#
說明:
第一條記錄是查找出的進程;第二條結果是grep進程自己,並不是真正要找的進程。
實例2:查找指定進程個數
命令:
ps -ef|grep svn -c
ps -ef|grep -c svn
輸出:
[root@localhost ~]# ps -ef|grep svn -c
2
[root@localhost ~]# ps -ef|grep -c svn
2
[root@localhost ~]#
說明:
實例3:從文件中讀取關鍵詞進行搜索
命令:
cat test.txt | grep -f test2.txt
輸出:
[root@localhost test]# cat test.txt
hnlinux
peida.cnblogs.com
ubuntu
ubuntu linux
redhat
Redhat
linuxmint
[root@localhost test]# cat test2.txt
linux
Redhat
[root@localhost test]# cat test.txt | grep -f test2.txt
hnlinux
ubuntu linux
Redhat
linuxmint
[root@localhost test]#
說明:
輸出test.txt文件中含有從test2.txt文件中讀取出的關鍵詞的內容行
實例3:從文件中讀取關鍵詞進行搜索 且顯示行號
命令:
cat test.txt | grep -nf test2.txt
輸出:
[root@localhost test]# cat test.txt
hnlinux
peida.cnblogs.com
ubuntu
ubuntu linux
redhat
Redhat
linuxmint
[root@localhost test]# cat test2.txt
linux
Redhat
[root@localhost test]# cat test.txt | grep -nf test2.txt
1:hnlinux
4:ubuntu linux
6:Redhat
7:linuxmint
[root@localhost test]#
說明:
輸出test.txt文件中含有從test2.txt文件中讀取出的關鍵詞的內容行,並顯示每一行的行號
實例5:從文件中查找關鍵詞
命令:
grep 'linux' test.txt
輸出:
[root@localhost test]# grep 'linux' test.txt
hnlinux
ubuntu linux
linuxmintlp.
[root@localhost test]# grep -n 'linux' test.txt
1:hnlinux
4:ubuntu linux
7:linuxmint
[root@localhost test]#
說明:
實例6:從多個文件中查找關鍵詞
命令:
grep 'linux' test.txt test2.txt
輸出:
[root@localhost test]# grep -n 'linux' test.txt test2.txt
test.txt:1:hnlinux
test.txt:4:ubuntu linux
test.txt:7:linuxmint
test2.txt:1:linux
[root@localhost test]# grep 'linux' test.txt test2.txt
test.txt:hnlinux
test.txt:ubuntu linux
test.txt:linuxmint
test2.txt:linux
[root@localhost test]#
說明:
多文件時,輸出查詢到的信息內容行時,會把文件的命名在行最前面輸出而且加上":"做爲標示符
實例7:grep不顯示自己進程
命令:
ps aux|grep \[s]sh
ps aux | grep ssh | grep -v "grep"