Linux Shell 用法(二)scrip和find命令

錄製並回放終端會話

script
開始錄製終端會話:

$ script -t 2> timing.log -a output.session

完整的錄製過程如下:

$ script -t 2> timing.log -a output.session

find
要列出給定目錄下所有的文件和子目錄,可以採用下面的語法:

$ find base_path

bash_path可以是任意位置(例如/home/slynux),find會從該位置開始向下查找。. 指定當前目錄,… 指定父目錄。這是Unix文件系統中的約定用法。 例如:

$ find . -print

-name選項指定了待查找文件名的模式。這個模式可以是通配符,也可以是正則表達式。下面的例子中,’*.txt’能夠匹配所有名字以.txt結尾的文件或目錄。

$ find /home/slynux -name '*.txt' -print

find命令有一個選項-iname(忽略字母大小寫),該選項的作用和-name類似,只不過在匹配名字時會忽略大小寫。例如:

$ ls
example.txt EXAMPLE.txt file.txt 
$ find . -iname "example*" -print ./example.txt
./EXAMPLE.txt

find命令支持邏輯操作符。-a和-and選項可以執行邏輯與(AND)操作,-o和-or選項可以執行邏輯或(OR)操作。

$ ls
new.txt some.jpg text.pdf stuff.png
$ find . \( -name '*.txt' -o -name '*.pdf' \) -print ./text.pdf
./new.txt

下面的命令演示瞭如何使用-and操作符選擇名字以s開頭且其中包含e的文件:

$ find . \( -name '*e*' -and -name 's*' \)
./some.jpg

下面的命令可以匹配.py或.sh文件:

$ ls
new.PY next.jpg test.py script.sh 
$ find . -regex '.*\.(py\|sh\)$' ./test.py
script.sh

-iregex選項可以讓正則表達式在匹配時忽略大小寫。例如:

$ find . -iregex '.*\(\.py\|\.sh\)$' 
./test.py
./new.PY
./script.sh

find也可以用!排除匹配到的模式:

$ find . ! -name "*.txt" -print

上面的find命令能夠匹配所有不以.txt結尾的文件。該命令的運行結果如下:

$ ls
list.txt new.PY new.txt next.jpg test.py
$ find . ! -name "*.txt" -print .
./next.jpg
./test.py
./new.PY

下面的例子展示瞭如何列出運行在含有文件bundlemaker.def的目錄下的所有任務:

$ find -L /proc -maxdepth 1 -name 'bundlemaker.def' 2>/dev/null

-L選項告訴find命令跟隨符號鏈接
從/proc目錄開始查找
-maxdepth 1將搜索範圍僅限制在當前目錄
-name 'bundlemaker.def’指定待查找的文件
2>/dev/null將有關循環鏈接的錯誤信息發送到空設備中

-mindepth選項類似於-maxdepth,不過它設置的是find開始進行查找的最小目錄深度。 這個選項可以用來查找並打印那些距離起始路徑至少有一定深度的文件。例如,打印出深度距離 當前目錄至少兩個子目錄的所有名字以f開頭的文件:即使當前目錄或dir1和dir3中包含以f開頭的文件,它們也不會被打印出來。

$ find . -mindepth 2 -name "f*" -print 
./dir1/dir2/file1
./dir3/dir4/f2

find命令可以使用-type選項對文件搜索進行過濾。藉助這個選項,我們可以告訴find命
令只匹配指定類型的文件。
只列出所有的目錄(包括子目錄):

$ find . -type d -print

將文件和目錄分別列出可不是件容易事。不過有了find就好辦了。例如,只列出普通文件:

 $ find . -type f -print

只列出符號鏈接:

$ find . -type l -print

在這裏插入圖片描述

Unix/Linux文件系統中的每一個文件都有3種時間戳,如下所示。
訪問時間(-atime):用戶最近一次訪問文件的時間。
修改時間(-mtime):文件內容最後一次被修改的時間。
變化時間(-ctime):文件元數據(例如權限或所有權)最後一次改變的時間。

打印出在最近7天內被訪問過的所有文件。

$ find . -type f -atime -7 -print

打印出恰好在7天前被訪問過的所有文件。

$ find . -type f -atime 7 -print

打印出訪問時間超過7天的所有文件。

$ find . -type f -atime +7 -print

-mtime選項會根據修改時間展開搜索,-ctime會根據變化時間展開搜索。 -atime、-mtime以及-ctime都是以“天”爲單位來計時的。find命令還支持以“分鐘”
爲計時單位的選項。這些選項包括:
-amin(訪問時間);
-mmin(修改時間);
-cmin(變化時間)。
打印出7分鐘之前訪問的所有文件:

$ find . -type f -amin +7 -print

–newer選項可以指定一個用於比較修改時間的參考文件,然後找出比參考文件更新的(更 近的修改時間)所有文件。
例如,找出比file.txt修改時間更近的所有文件:

$ find . -type f -newer file.txt -print

find命令的時間戳處理選項有助於編寫系統備份和維護腳本。

基於文件大小的搜索
可以根據文件的大小展開搜索:

大於2KB的文件

$ find . -type f -size +2k

小於2KB的文件

$ find . -type f -size -2k

大小等於2KB的文件

$ find . -type f -size 2k

除了k之外,還可以用其他文件大小單位。
b:塊(512字節)。
c:字節。
w:字(2字節)。
k:千字節(1024字節)。
M:兆字節(1024K字節)。
G:吉字節(1024M字節)。

也可以根據文件權限進行文件匹配。列出具有特定權限的文件:

$ find . -type f -perm 644 -print 

打印出權限爲644的文件

perm選項指明find應該只匹配具有特定權限值的文件。

Web服務器上的PHP文件需要具有合適的執行權限。我們可以用
下面的方法找出那些沒有設置好執行權限的PHP文件:

$ find . -type f -name "*.php" ! -perm 644 –print PHP/custom.php
$ ls -l PHP/custom.php
-rw-rw-rw-. root root 513 Mar 13 2016 PHP/custom.php

可以使用下面的命令打印出用戶slynux擁有的所有文件:

$ find . -type f -user slynux -print

刪除匹配的文件
find命令的-delete選項可以刪除所匹配到的文件。下面的命令能夠從當前目錄中刪 除.swp文件:

$ find . -type f -name "*.swp" -delete

你必須以root用戶的身份執行find命令才能夠更改文件或目錄的所有權。

# find . -type f -user root -exec chown slynux {} \;

將給定目錄中的所有C程序文件拼接起來寫入單個文件all_c_files.txt。方法如下:

$ find . -type f -name '*.c' -exec cat {} \;>all_c_files.txt

$ find . -type f -name '*.c' -exec cat {} > all_c_files.txt \;

$ fine  . -type f -name '*.c' -exec cat {} >all_c_files.txt +

下列命令可以將10天前的 .txt文件複製到OLD目錄中:

$ find . -type f -mtime +10 -name "*.txt" -exec cp {} OLD \;

使用-prune選項排 除某些符合條件的文件:

$ find devel/source_path -name '.git' -prune -o -type f -print

-name “.git” –prune是命令中負責進行修剪的部分,它指明瞭.git目錄應該被排除在外。 -type f –print描述了要執行的操作。

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