Linux系統Find命令的三個高級應用

原貼:http://www.redbots.cn/linux/2009/04/30/9835.htm

Linux系統Find命令的三個高級應用

1 Star2 Stars3 Stars4 Stars5 Stars (歡迎您爲本文打分)
Loading ... Loading ...

Find命令是Linux操作系統中一個很強大的工具。這個命令除了可以用來定位文件外,還有其他許多很實用的用途。如可以用來備份文件、交互式刪除文件、列舉文件清單等等。只要靈活應用這些功能的話,那麼對於系統工程師的日常工作就能夠起到事半功倍的效果。

一、利用Find命令對文件進行備份

如在Linux操作系統中有一個用戶爲oracle。系統會在Home目錄下自動爲這個用戶創建一個子目錄Oracle。現在用戶希望能夠對自己目錄下的文件進行自動備份,以防止文件的以外丟失。如下圖所示,現在系統工程師準備把用戶目錄下面的文件備份到backup目錄下面,並把文件名字重命名爲backup。這個功能可以實現呢?答案當然是肯定的。可以利用find命令結合cp命令來實現這個功能。

1、文件的最後修改時間。

在Linux系統的文件屬性中,有非常重要的三個時間截,分別爲文件最後修改時間、文件最後訪問時間、inode節點最後修改時間。一旦用戶對某個文件執行了更改操作,則文件inode節點裏的最後修改時間就會被更新了。需要注意的是,在Linux操作系統中目錄也被當作文件的一種,爲此對目錄的修改,如創建一個目錄或者更改目錄的名字也會被當作文件的修改來對待。另外文件修改後,只會更改文件的修改時間,而不會影響到目錄的最後修改時間。所以如果一個目錄下有一個文件更改了,則在備份的時候只需要備份這個更改的文件即可,而不需要備份這個目錄下其他沒有更改的文件。

出於備份效率的考慮,在備份的時候只備份當天修改過的文件。爲此在備份時首先要做的就是找到這些最近更改過的文件。這個解決的思路就是從這個文件的最後修改時間入手。在find命令中有一個參數爲mtime,它表示修改時間少於x天。如果我們把這個參數設置爲1,那麼find命令就可以找出在最近一天內修改過的文件。爲此只需要對這些找到的文件進行備份即可。

2、重命名文件。

需要備份的文件找到之後,接下去要做的就是利用cp命令把這些文件複製到其他目錄中去。但是這裏還需要做的一件事情是在複製過去後需要把文件進行重命名,即在原來文件的後面加上.backup,以提醒用戶這些是備份文件,不能夠刪除或者修改。要實現這個功能的話,就需要用到文件名的佔位符號。如果利用cp命令複製文件後同時批量更改文件的名字,只需要使用 cp {} {}.backup即可。這裏的{}符號就是文件名的佔位符號。cp {} {}.backup這個命令的功能就是先把文件複製到一個特定的目錄中,然後在對複製過去的每個文件進行重命名,後面都依次加上.backup內容。

爲此要實現上面文件備份的需要,只需要使用命令

find /home/oracle –mtime 1 –exec cp {} /backup/{}.backup /;即可。

執行這個命令後,系統會在用戶主目錄下尋找所有修改時間少於1天的文件,並把找到的文件複製到/backup目錄下。並在每一個原始文件後面增加一個擴展名.backup。最後的/;是一個固定格式必須要有。然後系統工程師只需要把這個命令加入到cron中,讓操作系統在每天中午或者其他空閒的時間週期性執行這個命令即可。如此的話,操作系統就會自動對用戶的文件進行備份,以防止文件意外損壞或者修改所造成的損失。

另外需要注意的是,在Linux操作系統中find命令只可以找到最近一天修改的文件。而在Linux操作系統中,還有mmin參數,這個參數是以分鐘爲單位,如可以找到那些最近4個小時或者1個小時之內修改過的文件,從而提高備份的頻率。爲此系統工程師可以根據用戶的需要來調整文件備份的頻率。不過筆者認爲,一般情況下文件備份一天一次即可。

二、把找到的文件清單保存到文件中

Find命令還可以根據文件的權限來查找。如把用戶主目錄下所有用戶都可以讀寫的文件找出來。這些文件所有的用戶都可以修改,爲此具有一定的安全隱患。系統工程師可能希望把這些文件對應的清單保存到一個文件中,然後他們可以根據這份清單一個個的去調整權限。如果只是顯示在屏幕中的話,對於他們後需的工作很不方便。總不能夠拿筆抄下來或者每修改一個執行一下查詢命令吧?爲此把找到的文件清單保存到一個文本文件中是必需的。要實現這個需求的話,可以採用如下命令:

Find /home –perm 666 –type f –ls >detail.txt

在這條命令中,條件語句中主要用了兩個參數,分別爲權限參數perm與文件類型參數-type。在Linux操作系統中主要包括三類文件(其餘幾類不怎麼用),分別爲普通文件、目錄文件與連接文件。這裏只需要尋找普通文件,爲此就可以利用-type參數來指定需要查找的文件類型。另外值得注意的是,如果在條件語句中有多個參數話,則其默認會採取的是與運算,即必須同時滿足以上兩個條件的文件纔會被查找出來。如果系統工程師需要採用或預算的話,則需要在參數之間加入-o可選項,它表示條件之間的關係是或的關係,只需要滿足其中任何一個條件即可。在查詢條件中還有一個很重要的操作符,即!操作符,它表示相反的條件。如現在系統工程師想查找所有的目錄文件與普通文件(不考慮其他種類的特殊文件),則有兩種表示方法。一是 –type f –o –type –d;二是! –type l。很明顯採用了!操作符的第二種處理方式要簡單的多。爲此系統工程師可以根據自己的需要來選擇合適的操作符。

其次在第三部分的動作參數中大家可以看到,在上面的例子中採用了exec關鍵字,但是在這個例子中卻沒有用到。這是爲什麼呢?原來在find命令的定義中,由於ls命令與print命令比較常用,爲此用到這兩個命令的時候,直接利用橫杆加上命令即可。如果使用其他命令則需要加入exec關鍵字。

三、交互式複製找到的文件

如現在用戶需要把某個文件夾下自己所創建的文件複製到另外一個目錄中。但是並不是所有的文件,用戶希望能夠自己來選擇是否需要進行復制。要實現這個目的的話,就需要用到find命令中的ok參數。在命令參數種加入-ok選項,主要是告訴操作系統這個命令需要以交互式的方式來執行。當用戶輸入y的話,操作系統就會執行這些動作;而輸入n的話,則會忽略。

如要實現上面這個需求,可以執行這個命令來實現。Find /home –user oracle –ok cp {} /backup /;此時這個OK選項的意思就是當把每個查找到的文件移動到指定的目錄時,不管目標文件是否存在,都需要用戶進行確認。只有用戶輸入y後,ok 後面的命令纔會被執行,否則的話就會被忽略不計。除了OK選項外,有些命令本身就包含了一個交互性的選項。如rm文件刪除命令。若沒有帶-i交互性選項的話,則操作系統會直接刪除文件,而不會等待用戶確認。但是若在這個命令後面加入-i選項的話,則每刪除一個文件的話,系統就會提示用戶確認。只要命令本身就支持這個-i交互式選項,那麼在find命令中就可以直接使用這個參數,而不需要利用ok選項。在大部分命令中,這兩個選項的效果是相同的。但是有些則不同。如CP命令。Cp –i命令表示把文件從一個地方複製到另外一個地方,如果目標文件已經存在的話,則會提醒用戶是否需要覆蓋;如果不存在的話則會直接複製過去。但是採用ok 選項的話則表示無論目標文件是否存在,都需要系統管理員一一進行確認。也就是說-i選項只有在目標文件存在的時候,可能需要覆蓋纔會讓用戶進行確認。而 ok選項的話則根本不管目標文件存在與否,都要進行確認。到底需要採用哪個參數,則就要根據用戶的需要了。

另外也可以利用這個find命令來交互式的刪除文件。如Find /home –user oracle –exec rm –I {} /;。在這個命令中就是用到了rm刪除命令自帶的-i交互式選項。默認情況下文件刪除時是不需要用戶確認的。但是無疑這是比較危險的一個動作。爲此在涉及到文件刪除操作、或者原始文件可能被覆蓋的情況下,最好能夠使用交互式的方式進行。

發佈了75 篇原創文章 · 獲贊 35 · 訪問量 369萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章