哎呀,隨着年齡的增大記性越來越差了之前學過的一些命令也就依稀記得寫命令名字了(大寫的監介,你懂得),趁着年前還有點時間就先把find命令簡單整理一下吧,其實都知道葫蘆裏賣的什麼藥(手動哈哈)!
有人可能會說了記得名字其他不就好辦了嗎,直接命令行真男人(man)一下就可以拯救世界了,話雖如此,誰讓本人只對女人感興趣咧~,不扯了開始正題。
先看下find用法格式:
find [path...] [expression]
常用選項
-name:指明要查詢的文件名;
-type :指明所要查詢的文件類型;
(1) l :符號文件。
(2) f:普通文件。
(3) d:目錄文件。
(4) p:管道文件。
(5) c:字符設備文件,提供連續的數據流,讀取數據按照先後順序,通常不支持隨機存取,比如鍵盤、鼠標、串口。
(6) b:塊設備文件,從設備的任意位置讀取一定長度的設備,也就是可以隨機存取,比如硬盤、U盤、SD卡。
(7) socket:套接字文件。
-amin [+|-] time:查找在指定時間曾被存取過的文件或目錄,單位以分鐘計算;
-mtime [+|-] time:查找在指定時間曾被更改過的文件或目錄,單位以24小時計算;
圖片來源於網絡
示例1:查詢24小時內被修改過的文件,通過使用-mtime 0 即可完成操作,現在時間是2017.01.13 21:00,那0就表示從當前時間到2017.01.12 21:00這個時間之內被修改過的文件;
示例2:查詢2天內/etc目錄下被修改過的文件;
~]# find /etc -mtime -2 #是指01.11那天到01.13中間的時間,但是其實並不包含11日那天。
示例3:查詢2天前修/etc目錄被修改過的文件;
~]# find /etc -mtime +2 #與【-】號正相反從01.11號開始算,幷包含11號當天。
-size [+|-] 文件大小:查找指定文件大小的文件;
-perm [+|-]文件權限:找符合指定的權限數值的文件或目錄;
+:表示的是或的意思,比方說查找具有4755權限的文件,那如果文件權限爲644也會被查詢出來,因爲4755中也包含了644。
-:表示的是與的意思,即屬主屬組和其他這三者的權限全部符合指定條件纔會被選定。
-newer <參考文件或目錄名>:查找其更改時間較指定文件或目錄的更改時間更接近現在的文件或目錄;
-maxdepth <目錄層級>:這個在特定情況下也會用到,表示如果目錄是多層嵌套的,那設定此值就是最大查詢到的目錄層數。
-nouser:查找沒有屬主的文件或目錄;
-nogroup:查找沒有屬組的文件或目錄;
-user <用戶名>:查找屬主爲指定用戶的文件或目錄;
-group <組名>:查找屬組爲指定屬組的文件或目錄;
-path <範本樣式>:指定字符串作爲尋找目錄的條件;
-prune :不尋找字符串作爲尋找文件或目錄的範本樣式,此選項可以在查詢的目錄中選擇一些不希望被查找的目錄來忽略,通常跟-path搭配使用;
示例:find / -path "/proc" -prune
最後要說的一點就是find命令還有一個額外的功能,查找完指定條件的結果之後還可以通過exec參數來與其他命令組合使用來進行返回結果的處理。
示例:查找系統中沒有屬主和屬組的文件,並將其進行刪除操作;
~]# find / -path "/proc" -prune -o -nouser -nogroup -exec rm -rf {} \;
====****我是分割線****========****我是分割線****====
後邊的例題用到grep ,爲了方便可以先將其創建一個別名便於使用
~]# alias grep=egrep --color=auto
1、找出/etc/rc.d/init.d/functions文件中某單詞後面跟一組小括號的行,形如:hello();
~]# grep "\<[_[:alpha:]]+\>\(\)" /etc/rc.d/init.d/functions
2、使用echo命令輸出一個絕對路徑,使用grep取出其基名;擴展:取出其路徑名
(1) 取基名:
~]# echo "/etc/sysconfig/network-scripts/" |grep -o "[^/]+/?$"
(2) 取路徑名:
這個題如果在最後的目錄分割符沒有的情況使用grep比較好取,但要是實現dirname命令的所取得的結果,目前我只能使用sed來完成,grep還不知道怎麼寫正則表達式比較好。
~]# echo "/etc/sysconfig/network-scripts/" |sed 's@\(^/.*\)/\([^/]\+\)/\?$@\1@'
3、找出ifconfig命令結果中的1-255之間數字
(1)
~]# ifconfig |grep -o "[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]"
(2) 擴展,找出內容之後進行格式化輸出:
~]# ifconfig |grep -o "[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]"|sort -n|awk '{dig[$1]++}END{for(i in dig){printf "The digit %d\t has appears %d times\n",i,dig[i]}}'
4、查找當前系統上沒有屬主或屬組的文件;進一步:查找當前系統上沒有屬主或屬組,且最近3天內曾被訪問過的文件或目錄;
(1)沒有屬主或屬組
~]# find / -nouser -nogroup
(2) 在條件一的基礎上在查找3天內被訪問過的文件或目錄
~]# find / (-nouser -o -nogroup) -atime -3
5、查找/etc目錄下大於1M,且類型爲普通文件的所有文件;
~]# find /etc -size +1M -type f
6、查找/etc/init.d/目錄下,所有用戶都有執行權限,且其它用戶有寫權限的文件;
~]# find /etc/init.d -perm -113 -exec ls -l {} \;
7、查找/etc目錄下最近一週內其內容被修改過,且不屬於root或hadoop的文件;
~]# fine /etc -not \( -user root -o -user hadoop \) -mtime -7 -exec ls -l {} \;
8、複製/etc/rc.d/rc.sysinit文件至/tmp目錄,將/tmp/rc.sysinit文件中的以至少一個空白字符開頭的行的行首加#;
~]# cp -r /etc/rc.d/rc.sysinit /tmp
方法一、使用vim進行編輯操作在命令模式下操作
~]# %s@^[[:space:]]\+@#@
還有一種是使用\s來替代空白字符
~]# %s@^\s\+@#@g
注此種方法是將查找到的內容替代成#號,如果是在符合條件的行前添加#號的話應該使用後向引用
~]# %s@\(^\s\+\)@#\1@g
還有一種方法就是可以在不用打開文件的情況下完成以上操作
~]# sed -i -r 's@^[[:space:]]+@#&@' /tmp/rc.sysinit
注意:此操作在生產環境中儘量先測試一下再將文件中的內容替換掉,以防後悔!
9、刪除/tmp/rc.sysinit文件中的以#開頭,且後面跟了至少一個空白字符的行行的#和空白字符
同第8題
方法一、在vim命令模式下操作
~]# %s@^#\s\+@@g /tmp/rc.sysinit
方法二、使用sed編輯替換
~]# sed -i -r 's@^#[[:space:]]+@@' /tmp/rc.sysinit
10、將/etc/yum.repos.d/CentOS-Media.repo文件中所有的enabled=0或gpgcheck=0的最後的0修改爲1;
方法一、vim打開文件在命令模式全局替換
~]# %s@\(enabled|gpgcheck\)\=0@\11@g
方法二、使用sed處理非常便捷,但是不熟練的話,還是先測試沒問題之後再使用-i選項進行寫入操作吧
~]# sed -r -i 's@\(enabled|gpgcheck\)\=0@\1=1@g' /etc/yum.repos.d/CentOS-Media.repo
11、每週2,4,6備份/var/log/messages文件至/backup/messages_logs/目錄中,保存的文件名形如messages-20161202
使用vim 編輯/etc/crontab文件
~]# vim /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed 0 0 * * 2,4,6 root dd if=/var/log/messages of=/backup/messages_logs/messages-`date +%Y%m%d`
12、每天每兩小時取當前系統/proc/meminfo文件中的所有以S開頭的信息至/stats/memory.txt文件中
使用vim 編輯/etc/crontab文件
~]# vim /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed 0 */2 * * * root grep "^S.*" /proc/meminfo >>/tmp/memory.txt
13、寫一個腳本創建10個用戶user10-user19;密碼同用戶名
~]# mkdir scripts ~]# vim addUser.sh #!/bin/bash # #Program: Automatically create user scripts #History: #Author: Bing Version:0.0.1 2017-01-13 15:52 for i in {10..19};do if ! `id user$i &>/dev/null`;then useradd user$i &>/dev/null && echo "user$i"|passwd --stdin user$i &>/dev/null && echo "user$i create success!" else userdel -r user$i &>/dev/null && echo "user$i delete success!" fi done