本篇記錄2個指令,分别是:find,xargs
1.find
作用: 按檔案結構周遊搜素,找到符合條件的檔案并按照相應的操作來展現
格式:
預設路徑是在目前目錄,列印資訊用-print
expression包含幾個因素:操作,操作數,測試表達式,動作
parameter | function |
---|---|
-name | 按名稱尋找檔案 |
-exec | 找到檔案後再執行exec指令後面的操作 |
-type | 按類型查找檔案 |
輸出找到的檔案的資訊 | |
-user | 按所有者(檔案的主人)來查找檔案 |
-mtime -n +n | 根據修改時間找到檔案 |
1.1按普通的條件查找
使用例子:
1.列印目前路徑下的檔案的資訊,隻列印前十條
find . -print |head -10
2.列印目前路徑下以.txt結尾的檔案的資訊
find . -name "*.txt" -print |head -10
這裡不用type,因為type是關于幫助檔案,可執行檔案之類的定義的,跟pdf,txt這種檔案類型不一樣,在詳細資訊中可以找到
3.列印目前路徑下以.txt結尾或者以.pdf的檔案的資訊
4.列印目前路徑下除了以.txt結尾的檔案的資訊
find . ! -name "*.txt" -print |head -10
-print可以不要,結果一樣的
5.按檔案類型查找檔案
查找普通檔案
補充知識: 關于檔案的類型如下:
parameter | function |
---|---|
-f | 普通檔案 |
-l | symbolic link file符号連結檔案 |
-d | directory 目錄 |
6.按修改時間查找檔案,超找48小時内修改過的檔案
find -atime -2
7.按照目錄和檔案權限來查找檔案,查找/home/ling目錄下 權限為 777的檔案
find /home/ling -perm 777
8.列印目前目錄下所有以txt結尾的符号連結檔案
8.列印目前目錄下所有以php結尾的,權限是777的普通檔案
find . -type f -name "*.php" -perm 777
9.列印目前目錄下所有root持有的檔案
find . -type f -user root
10.列印目前目錄下所有權限不是777也不是644的普通檔案
注意777不可寫成"777"
(待完成:準備檔案時,修改權限無效的解決辦法)
1.2 查找後執行指令 -exec
1.ls -l指令放在find指令的-exec選項中
2.在目錄中查找更改時間在2日以前的檔案并删除它們
**備注:**2天以内的用-2
3.在目錄中查找更改時間在2日以前的檔案并删除它們,在删除之前先給出提示
-ok是-exec的安全模式,每次執行前都會提示
4.-exec中使用grep指令,先比對所有檔案名為“ passwd*”的檔案,例如passwd、
passwd.old、passwd.bak,然後執行grep指令看看在這些檔案中是否存在一個root使用者
5.查找檔案移動到指定目錄home/ling
6.用exec選項執行cp指令
7.将所有.c檔案中的代碼合并到all.c
注意指令和其他符号之間要有間隔,比如cat 和{}之間,不然就會被識别成一串的
8.當指令行較多時可以将exec腳本放入檔案,然後執行檔案。請寫出找到目前所有的.c檔案後,列印第一個檔案,并将它合并到all.c,列印并合并的操作放到目前目錄下command.sh的檔案裡的操作
command.sh的内容:
#! /bin/sh
ls -l $1
cat $1
第一行是sh檔案開頭必須寫的,用來告訴系統需要什麼程式執行
$1代表第一行
2.xargs
作用: 在使用 find指令的-exec選項處理比對到的檔案時, find指令将所有比對到的檔案一起傳遞給exec執行。但有些系統對能夠傳遞給exec的指令長度有限制,這樣在find指令運作幾分鐘之後,就會出現溢出錯誤。錯誤資訊通常是“參數列太長”或“參數列溢出”。這就是xargs指令的用處所在,特别是與find指令一起使用。
格式:
parameter | function |
---|---|
n | 一行最多列印幾個字 |
d | 尋找分割符,相當于java String 類裡的split() |
使用例子:
1.将a.tx裡的好幾行内容變成一行
檔案a.txt裡的内容:
1 2 3
4 5 6 7
8 9
結果:
2.将一行變成n行
3.用i分割開字元串并按每行最多3個列印
4.查找系統中的每一個普通檔案,然後使用xargs指令來測試它們分别屬于哪類檔案
5.在目前目錄下查找所有使用者具有讀、寫和執行權限的檔案,并收回相應的寫權限
find . -perm -7 -print | xargs chmod o-w
使用-i參數預設的前面輸出用{}代替,-I參數可以指定其他代替字元,如例子中的[]
6.用grep指令在所有的普通檔案中搜尋hostname這個詞
\是表示轉義,用來取消find指令中的*在shell中的特殊含義
7.使用xargs執行mv
find . -name "*.log" | xargs -i mv {} test4
使用-i參數預設的前面輸出用{}代替,-I參數可以指定其他代替字元,如下面例子中的[]