2012年3月24日

[轉載]linux批量查找文件內容


來源:http://tw.myblog.yahoo.com/jw!ubwAvBaBBwR5eN4p53mQmQQo/article?mid=6

比如查找當前目錄下面所有的php文件裡面的內容
find ./ -name "*.php" | xargs grep '要查找的內容'
如果需要查找的內容包含特殊符號,比如$等等,grep要加參數
find ./ -name "*.php" | xargs grep -F '要查找的內容'
查找一個文件名為*.tar.gz或*.exe的文件
-bash-3.00# find ./ -type f -name "*.tar.gz" -o -name "*.exe"
想查找出在/etc中以passw開頭的所有文件中有沒有te這些內容的,並且開頭是2的內容.
-bash-3.00#find /etc -name "passw*" -exec grep -in "te" {} \; |sed -ne '/^2/p'
找出/var目錄下15天以前以a為開頭,並且後綴只有4位的文件進行打包.
find /var/ -name "a.????" -mtime +15 -exec tar zcf "{}.tar.gz" -P {} \;

find 其實是一個很有用的工具,且常用的工具。

◎find - walk a file hierarchy 
     在一個檔案等級制度中遊走 顧名思義 也就是搜尋
◎語法: find path operators
        path:路徑 operators:運算子(參數)
     
◎operators: 常用的參數如下 (若有疑義請參閱man page 為準
        ★號表示重要...
    1. -atime n: 用檔案存取時間(access)為搜尋條件,n 為數字代表週期,
           單位是24小時。
          
     ★註解:   n不帶正負時,表示距今從目前這個週期到下個週期為止
           n為負號時(-),表示距今這個週期之前。
           n為正號時(+),表示距今大於這個週期的時間。
          
           舉例說明:
           若n為3(不帶正負號),表示距今72~96小時。
           若n為-3(帶負號),表示距今0~72小時內。
           若n為+3(帶正號),表示距今超過72小時,也就是>72小時。
   
    2.-mtime n: 用檔案修改時間(modification)為搜尋條件,n以24小時為週期。
   
    3.-ctime n: 用檔案inode更動時間為條件,n以24小時為週期。
   
    4.-inum n: 用inode值來作為搜尋條件,n為該檔案的inode值。   
   
    5.-name filename:後接檔案名稱,若包含"萬用字元",則要括起來,
              避免shell解讀之。
    6.-perm mode: 以存取權限為搜尋條件。    
   
    7.-user name: 以檔案的所有者為搜尋條件,用uid也可。
   
    8.-group name: 以檔案的群組為搜尋條件,用gid亦可。
    註:7.8 find會先用name搜尋,若找不到才試著用uid或gid搜尋
   
    9.-type t: t的代表的是檔案的類型,類型常用的如下:
           d  --> 資料夾
           f  --> 一般檔案
           l  --> 符號連結檔
          
   10.-size n: n表示區塊數,通常是512-byte bolck,
         若n後接c (nc) 表示為n bytes。
        
  ★11.operator1 -a operator2: -a 等同於邏輯上的 AND 
     operator1 -o operator2: -o 等同於邏輯上的 OR
     ! operator1 : ! 等同於邏輯上的 NOT
     
    註:operator1 -a operator2 與operator1 operator2
      是相同的...同樣代表當運算子1成立且運算子2成立
      
  ★12.\( expression \): 在?#125;雜的情況下,括號表示先運算。
       加上反斜線\ 為的是不要讓shell誤判。  
             
   13.-print: 將搜尋結果送到標準輸出stdout,一般來說也就是螢幕。
        註:最常用到 但也常被遺忘的參數。            
   
  ★14.-exec command: 表示將搜尋的結果,再導入某一命令。
        註:搜尋出的結果可用兩個大括號{} 替代,命令後接 \; 表示結束。
      
      ex:將目前目錄 搜尋出檔案以.o結尾的檔案 刪除!!
        find . -name "*.o" -exec rm -f {} \;          
       
  ★15.-maxdepth n: n 表示搜尋的深度。1表示目前這個資料夾。
  
  ★16.-ok command: -ok跟-exec相同,不過執行前會詢問。通常用來測試。
  
  ★17.-newer file: 比file修改(modification)的時間更早為搜尋條件  

◎實例應用:
   1.修改時間: 假設是此目錄 7天前(當天)修改過的檔案
         find . -mtime 7 -print
         find . -mtime +6 -mtime -8 -print
   2.檔案大小: 檔案介于于1000byte到32000byte之間
           find . -size +1000c -size -32000c -print
   
  ★3.刪除某些詭異的檔案: 某些檔案因含有特殊字元而無法刪除,
           find . -inum 31246 -exec rm -rf {} \;
           註:31246為其inode值,可用ls -i 察看..
   
  ★4.以精確的時間搜尋:搜尋2001年5月28日11時59分到2001年5月29日0時10分間所有的檔案
           a. touch -t 200105281159 file1
           b. touch -t 200105290010 file2
           c. find . -newer file1 ! -newer file2 -print
             如此就會搜尋出數個檔案 扣除file2的就是所得...
            
  ★5.將檔案更名:把搜尋出來的更名為
          find . -maxdepth 1 -name "*.o" -exec mv {} {}.orig 
          將檔名符合*.o的檔案名稱附加上.orig
         
      ★註解:若您第五個無法執行的話也可以這樣做:
         $find . -maxdepth 1 -name "*.o" |
          > while read file
          > do mv "$file" "$file".orig
          > done
         
          > 乃是換行後自動出現的提示符號...

  ★6.找到檔案中包含某字元的檔案:(此例為success)
          find . -type f -exec "success" {} /dev/null /; 
      
      ★註解: 沒有加上 /dev/null 會產生無法得知搜符合尋結果檔案名稱的結果.
           若加上/dev/null 則會讓 grep 每次搜尋兩個檔案,在搜尋結果產生檔名.
      
      當然了..若常用可以寫成script 如find2.
      if test
      then
      find . -type f -exec grep /dev/null {} \;
      else
      echo "正確的語法為: ./find2 搜尋字詞 "
      fi
          
◎重要觀念:
  ★1.搜尋參數 都是find懂的常規表示法,若表示法為真,就執行一些設定好的動作。
   
  ★2.括號中的先運算: -atime +5 \( -name "*.o" -o -name "*.tmp" \)
            表示搜尋 存取時間大於5天 且(名稱為*.o或是*.tmp)的檔案    
            
   3.規則式中兩個運算子間若用空白隔開表示 -a 也就是AND
   
  ★4.find任務就是判定整個運算式,而不是找到檔案,
    當然,會找到檔案,但那只是一個副作用。
    
   5.儘量不要搜尋NFS檔案,因為萬一NFS server 掛了,會讓整個搜尋停頓。
    可以用-maxdepth 或 -prune 限制        
        
◎困難排除:
  ★xargs的使用:
   有時您會遇到向下面這種情況...語法無誤 但卻無法顯示
   find / -print | ls -al   顯示根目錄下的所有檔案
   系統會直接出現Broken pine 然後就結束了...
   或是出現too many argument ..則表示輸出超出指令列上的長度。
   這時就要用到xargs了...整個命令列如下
   find / -print | xargs ls -al
   結果就會很順利的出現..因為xargs將輸入一個一個依序輸出,
   而非一次全部。
   
   說明:xargs看似無用,卻有意想不到的功用喔.

2012年3月17日

bash shell script兩三事 (3)

$ operator的三種擴展模式
${variable_name}
$(command)
$((expression))

字串操作
${variable:start_position}
${variable:start:length}
${#variable}字串長度

算術運算
$((expression))
expr expression
$[expression]
declear -i var=expression
let expression

r=$((2+3))
r=`expr 3+2`
r=$[4+5]
declare -i r=5*5
let i=5+5

條件判斷
if test1; then
  statements
elif test2; then
  statements
...
else
  statements
fi
測試條件仿照c的邏輯,非null/0為真
if [-d /root/tmp]; then
  echo '/root/temp directory exists!'
else
  echo "/root/temp directory doesn't exist!"

2012年3月13日

linux所支援的檔案系統

使用
cat /proc/filesystems
就會列出支援的檔案類型,尤其在 嵌入式 系統,這應該特別有用,因為嵌入式常會因為占用記憶體空間的關係取消某些檔案類型的支援

2012年3月8日

使用wpa_supplicant指令上網

看名稱WPA請求(supplicant)似乎適合呼邏輯,雖然個人認為不大直覺
首先確定ifconfig wlan0 up有起來(用ifconfig確定即可)
wpa_passphrase essid password>wpa.conf
這裡是將essid跟password填寫入一個設定檔案,因為編碼過後的密碼長度不是一般人背得下來的(如果有本事背出超過30個字元的人應該可以不必XD)
wpa_supplicant -BDwext -iwlan0 -cwpa.conf
-BD表示driver的type,一般使用wext (linux wireless extension)就可以了-c後面接著設定檔案的參數
dhclient wlan0
一般就是執行DHCP的client端獲取IP

另外如果喜歡互動是的介面有wpa_cli直接用一些指令的方式來溝通

P.S.如果不知道essid,可以用iwlist wlan0 scanning,他會列出附近少描到的AP ID
參考資料:
http://zh.wikipedia.org/wiki/WPA
http://en.wikipedia.org/wiki/Wpa_supplicant
http://hostap.epitest.fi/wpa_supplicant/
http://www.joecen.com/2007/10/26/linux-wireless-setting/
http://mysuperbaby.iteye.com/blog/1405729
http://ninitsai0206.blogspot.com/2010/11/using-wpacli-setting-wifi.html

bash shell script兩三事 (2)

bash shell變數就是
varName=value
如果沒有特別指出,一律default為string,也就是說
varNum=1這裡會變成字串1而非數字1
提取的變數value的方式有兩種
$varName跟${varName}
字串建議使用" "或者' '包起來,兩者不一樣是前者會做變數替換,後者不會,比方說
varName="jacky"
str1="Hi! $varName"
str2='Hi! $varName'
其中str1會顯示Hi! jacky!,而str2則保持原來的樣子
printf則是類似C的使用方式,不一樣的是,printf會幫字串中特殊字元加上跳脫符號(\)
shopt -s -o nounset
表示必須在使用前必須有assign value的動作,可以避免寫錯變數
unset varName
則可以刪除變數,而
varName=
則可以刪除環境變數

變數可以輸出為環境變數,只用
export varName
其中有兩個特別的環境變數為LOGNAMEUSER,LOGNAME指的是登入時後的名稱,USER是只現在身分的名稱,假如你已jacky這個一般ID登入,然後使用su變成super user,這時候LOGNAME為jakcy,USER為root。因為LOGNAME的關係,你所使用的PATH還是jacky的,並不包含/sbin下的指令,所以在使用一些指令的時候會遭遇command not found的問題,只要用
su -
加上一個減號,就可以讓LOGNAME也改成root了

一些特殊的變數
$1~$9,表示shell command後面的參數,如果超過第十個開始要使用${10}這樣的形式
$*表示所有參數所形成的字串
$@表示將參數以振烈表示
$#表示參數的個數
$$表示執行該shell command的PID

readonly可以用來宣告唯讀變數
readonly varName
readonly -a arrayName
第一個宣告一變數為唯讀,第二個宣告唯讀陣列

decleare指令可以調整以及顯示變數的屬性
變成唯讀
declare -r varName
宣告陣列
declare -a varName
宣告為整數型態
declare -i varName
宣告為環境變數
declare -x PATH
顯示函數及其屬性
declare -F
顯示變數屬性
declare -p varName


幾個重要的檔案
使用者個人設定
~/.bash_profile,登入時候執行的shell script
~/.bashrc,執行一個新的shell script之前執行
~/.bash_logout,登出的時候執行
系統管理者維護設定
/etc/profile,一些預設的設定,對全體user有效,通常有umask、PATH、LC_*等等設定
/etc/bash.bashrc,一份全域性的profile
/etc/skel下的檔案,使用者帳號建立的時候依照這裡組裝出.bash_profile與.bashrc

2012年3月7日

emacs編輯器

unix/linux底下的兩大console model編輯器,就是vi/vim與emacs,兩者各有支持者,好壞就不說,只是一直使用vim的我,最近在看到人家介紹emacs,實在想給他試用一下,再說說我個人的感覺

如果熟知vim,大致上他就兩種mode,一種insert,一種command model
相對於command model是emacs主要使用兩種組合鍵
C+k control key加上k
M+k meta key加上k
control key大概稍微看過鍵盤的人都知道,問題在於meta key,其實meta key有三種esc, alt, edit,最范用的是esc,但是我覺得alt最方便(但是在x-win會跟系統menu衝突),edit則是少數鍵盤才有的key
另外一個好處是跟壞處是,emacs有許多版本,如果預設安裝emacs,ubuntu會安裝x-win,可是我不喜歡,我想安裝console mode版本,也有名為emacs-nox,真夠簡潔XD,不過問題又來了,他會跟x-win版本衝突,所以必須要移除?好處是,他開啟的時候有中文的文件,vim幾乎都是英文的樣子(我遙遠的記憶,不知道現在翻譯完畢沒有!?)

在紀錄指令之前,我先說一下,對於meta key我實在很不欣賞,不管是vim或者emacs,我覺得esc按鍵離手很遠,用小指頻繁的去點,對手部是一個負擔,偏偏vim或者emacs都要用到orz

游標移動
C+v 下一頁
M+v 上一頁
C+l 刷新螢幕
C+p 向上
C+n 向下
C+f 向右
C+b 向左
M+f 向右一個word
M+b 向左一個word
C+a 一行開頭(home)
C+e 一行結尾(end)
M+a 句子開頭
M+b 句子結尾
參數模式
C+u 8 C+v 表示向下移動八行
C+u通常用來接受參數
編輯
直接輸入就是插入

    刪除游標所在的 前一個字元
C-d          刪除游標所在的 後一個字元
M-   刪除游標所在的 前一個字
M-d          刪除游標所在的 後一個字
C-k          刪除從游標所在到「行尾」間的字元
M-k          刪除從游標所在到「句尾」間的字元
C+x u 取消(undo)

Buffer操作
每個emacs的編輯視窗叫做buffer
C+x C+f 開啟檔案,意思是find
C+x C+b 表示列出所有buffer
C+x 1 (數字1)表示關閉其他buffer,只留下目前這個
C+x C+s save buffer
C+x k kill buffer
C-x C-c  離開 Emacs。

以上總結一下emacs tutorial一半的內容

2012年3月4日

bash shell script兩三事 (1)

#!念作sharp(#) bang(!)
bash -v test.sh
可以檢查shell script的syntax(語法)
bash -x test.sh
可以trace shell script
shopt -a -o nounset
強制變數一定要宣告之後才可以用

將指令結果存入變數的命令替換功能
舊的: `ls`
新的: $(ls)