Linux文件查找(locate & find)
locate
查詢系統上預建的文件索引數據庫(速度快,但更新不實時)
/var/lib/mlocate/mlocate.db
依賴于事先構建的索引
索引的構建是在系統較為空閑時自動進行(周期性任務), 管理員手動更新數據庫(updatedb,實際生產環境中不建議使用)
索引構建過程需要遍歷整個根文件系統,極消耗資源
工作特點:
查找速度快
模糊查找
非實時查找
搜索的是文件的全路徑,不僅僅是文件名
可能只搜索用戶具備讀取和執行權限的目錄
用法
locate KEYWORD
選項
? -i 執行區分大小寫的搜索
? -n N 只列舉前N個匹配項目
locate foo
? 搜索名稱或路徑中帶有“ foo”的文件
locate -r ‘\.foo$’
? 使用Regex來搜索以“ .foo”結尾的文件
find ( 精確查找,支持匹配符;只搜索磁盤文件(如proc不搜);默認自帶遞歸)
實時查找工具,通過遍歷指定路徑完成文件查找;
工作特點:
? 查找速度略慢
? 精確查找
? 實時查找
? 可能只搜索用戶具備讀取和執行權限的目錄
語法:
find [OPTION]… [查找路徑] [查找條件] [處理動作]
查找路徑:指定具體目標路徑;默認為當前目錄
查找條件:指定的查找標準,可以文件名、大小、類型、權限等標準進行;默認為找出指定路徑下的所有文件
處理動作:對符合條件的文件做操作,默認輸出至屏幕(如 -ls )
根據文件名和inode查找:
-name "文件名稱":支持使用glob
*, ?, [], [^]
-iname "文件名稱":不區分字母大小寫
-inum n 按inode號查找
-samefile name 相同inode號的文件
-links n 鏈接數為n的文件
-regex "PATTERN":以PATTERN匹配整個文件路徑字符串,而不僅僅是文件名稱
根據屬主、屬組查找:(僅根據UID號 GID號進行搜索,并不會根據用戶名和組名進行搜索)
-user USERNAME:查找屬主為指定用戶(UID)的文件
-group GRPNAME: 查找屬組為指定組(GID)的文件
-uid UserID:查找屬主為指定的UID號的文件
-gid GroupID:查找屬組為指定的GID號的文件
-nouser:查找沒有屬主的文件
-nogroup:查找沒有屬組的文件
根據文件類型查找:
-type TYPE:
f: 普通文件
d: 目錄文件
l: 符號鏈接文件
s:套接字文件
b: 塊設備文件
c: 字符設備文件
p: 管道文件
組合條件:(與 -a 的優先級比 或 -o 的優先級要高 ; 如果命令中有先計算或 -o然后再計算與-a的,要加括號 ; ( -o ) -a ) )
與: -a
或: -o
非: -not, !
德·摩根定律:
(非 P) 或 (非 Q) = 非(P 且 Q)
(非 P) 且 (非 Q) = 非(P 或 Q)
示例:
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
例子
find -name snow.png
? 搜索名為snow.png的文件
find -iname snow.png
? 不分大小寫地搜索名為snow.png、 Snow.png、SNOW.PNG等等的文件
find / -name “*.txt”
find /var –name “*log*”
find -user joe -group joe
搜索被用戶joe 以及組群joe所擁有的文件
find -user joe -not -group joe
find -user joe -o -user jane
find -not \( -user joe -o -user jane \)
find / -user joe -o -uid 500
找出/tmp目錄下,屬主不是root,且文件名不以f開頭的文件
find /tmp \( -not -user root -a -not -name 'f*' \) -ls
find /tmp -not \( -user root -o -name 'f*' \) –ls
排除目錄
示例:查找/etc/下,除/etc/sane.d目錄的其它所有.conf后綴的文件
find /etc -path ‘/etc/sane.d’ -a -prune
-o -name “*.conf” -print
根據文件大小來查找:
-size [+|-]#UNIT //-size 10k 只是搜索大小為(9-10]K的文件
常用單位: k, M, G
#UNIT: (#-1, #]
如: 6k 表示(5k,6k]
-#UNIT: [0,#-1]
如: -6k 表示[0,5k]
+#UNIT: (#,∞)
如: +6k 表示(6k,∞)
根據時間戳:(正數為未來時間,修改時間;負數為過去時間)
以“天”為單位;
-atime [+|-]#,
#: [#,#+1) // -atime 7 : [7,8)
+#: [#+1,∞] //atime +7 : [8,∞]
-#: [0,#) //atime -7 : [0,7)
-mtime
-ctime
以“分鐘”為單位:
-amin
-mmin
-cmin
根據權限查找:
-perm [/|-]MODE
MODE: 精確權限匹配(權限前不帶任何符號,即為精確匹配)
/MODE:任何一類(u,g,o)對象的權限中只要能一位匹配
即可,或關系, + : centos7之前的版本用 ; centos7開始用 /
–MODE:每一類對象都必須同時擁有指定權限,與關系
0 表示不關注(什么權限都可以,湊數)
find -perm 755 會匹配權限模式恰好是755的文件
只要當任意人有寫權限時, find -perm +222就會匹配
只有當每個人都有寫權限時, find -perm -222才會匹配
只有當其它人( other)有寫權限時, find -perm -002才會匹配
處理動作:
-print:默認的處理動作,顯示至屏幕;
-ls:類似于對查找到的文件執行“ ls -l”命令
-delete:刪除查找到的文件;
-fls file:查找到的所有文件的長格式信息保存至指定文件中
-ok COMMAND {} \; 對查找到的每個文件執行由COMMAND指定的命令;對于每個文件執行命令之前,都會交互式要求用戶確認
-exec COMMAND {} \; 對查找到的每個文件執行由COMMAND指定的命令;(直接執行,不會要求用戶確認)
{}: 用于引用查找到的文件名稱自身
find傳遞查找到的文件至后面指定的命令時,查找到所有符合條件的文件一次性傳遞給后面的命令
有些命令不能接受過多參數,此時命令執行可能會失敗,下面方式可規避此問題
find | xargs COMMAND
-0 換行
-rm 刪除
軟件包管理
軟件運行環境
API: Application Programming Interface
POSIX: Portable OS
程序源代碼 –> 預處理 –> 編譯 –> 匯編 –> 鏈接
靜態編譯:
共享編譯: .so
ABI: Application Binary Interface
Windows與Linux不兼容
ELF(Executable and Linkable Format)
PE( Portable Executable)
庫級別的虛擬化:
Linux: WINE
Windows: Cywin
C程序編譯過程
Java程序運行
開發語言
系統級開發
C
C++
應用級開發
java
delphi
Python
go
php
perl
ruby
包管理器
二進制應用程序的組成部分:
二進制文件、庫文件、配置文件、幫助文件
程序包管理器:
debian: deb文件, dpkg包管理器
redhat: rpm文件, rpm包管理器
rpm: Redhat Package Manager
RPM Package Manager
包命名
源代碼: name-VERSION.tar.gz|bz2|xz
VERSION: major.minor.release
rpm包命名方式:
name-VERSION-release.arch.rpm
例: bash-4.2.46-19.el7.x86_64.rpm
VERSION: major.minor.release
release: release.OS
常見的arch:
x86: i386, i486, i586, i686
x86_64: x64, x86_64, amd64
powerpc: ppc
跟平臺無關: noarch
包命名和工具
包:分類和拆包
Application-VERSION-ARCH.rpm: 主包
Application-devel-VERSION-ARCH.rpm 開發子包
Application-utils-VERSION-ARHC.rpm 其它子包
Application-libs-VERSION-ARHC.rpm 其它子包
包之間:可能存在依賴關系,甚至循環依賴解決依賴包管理工具:
yum: rpm包管理器的前端工具
apt-get: deb包管理器前端工具
zypper: suse上的rpm前端管理工具
dnf: Fedora 18+ rpm包管理器前端管理工具
庫文件
查看二進制程序所依賴的庫文件:
ldd /PATH/TO/BINARY_FILE
管理及查看本機裝載的庫文件:
ldconfig
/sbin/ldconfig -p: 顯示本機已經緩存的所有可用庫文件
名及文件路徑映射關系
配置文件: /etc/ld.so.conf, /etc/ld.so.conf.d/*.conf
緩存文件: /etc/ld.so.cache
包管理器
程序包管理器:
功能:將編譯好的應用程序的各組成文件打包一個或幾個程序包文件,從而方便快捷地實現程序包的安裝、卸載、查詢、升級和校驗等管理操作
1、包文件組成 (每個包獨有)
RPM包內的文件
RPM的元數據,如名稱,版本,依賴性,描述等
安裝或卸載時運行的腳本
2、數據庫(公共)
程序包名稱及版本
依賴關系
功能說明
包安裝后生成的各文件路徑及校驗碼信息
程序包的來源
管理程序包的方式:
使用包管理器: rpm
使用前端工具: yum, dnf
獲取程序包的途徑:
(1) 系統發版的光盤或官方的服務器;
CentOS鏡像:
https://www.centos.org/download/
(2) 項目官方站點
程序包的來源
(3) 第三方組織:
Fedora-EPEL:
Extra Packages for Enterprise Linux
Rpmforge:RHEL推薦,包很全
搜索引擎:
(4) 自己制作
注意:檢查其合法性: 來源合法性,程序包的完整性
rpm包管理
CentOS系統上使用rpm命令管理程序包:
安裝、卸載、升級、查詢、校驗、數據庫維護
安裝:
rpm {-i|–install} [install-options] PACKAGE_FILE…
-v: verbose
-vv:
-h: 以#顯示程序包管理執行進度
rpm -ivh PACKAGE_FILE …
rpm包安裝
[install-options]
–test: 測試安裝,但不真正執行安裝; dry run模式
–nodeps:忽略依賴關系
–replacepkgs | replacefiles
–nosignature: 不檢查來源合法性
–nodigest:不檢查包完整性
–noscipts:不執行程序包腳本片斷
%pre: 安裝前腳本; –nopre
%post: 安裝后腳本; –nopost
%preun: 卸載前腳本; –nopreun
%postun: 卸載后腳本; –nopostun
rpm包升級
升級:
rpm {-U|–upgrade} [install-options] PACKAGE_FILE…
rpm {-F|–freshen} [install-options] PACKAGE_FILE…
upgrade:安裝有舊版程序包,則“升級”
如果不存在舊版程序包,則“安裝”
freshen:安裝有舊版程序包,則“升級”
如果不存在舊版程序包,則不執行升級操作
rpm -Uvh PACKAGE_FILE …
rpm -Fvh PACKAGE_FILE …
–oldpackage:降級
–force: 強行升級
升級注意項
注意:
(1) 不要對內核做升級操作; Linux支持多內核版本并存,因此 ,對直接安裝新版本內核
(2) 如果原程序包的配置文件安裝后曾被修改,升級時,新版本的提供的同一個配置文件并不會直接覆蓋老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留
1、寫個腳本:
*
***
******
********
================================================
#!/bin/bash # read -p "Do you want to see how many floors ? " y r=1 l=1 o="\033[42m \033[0m" p="\033[42m*\033[0m" if echo $y | egrep -q "^[[:digit:]]+$";then #判斷用戶輸入的是否為純數字 while [[ $r -le $y ]];do #判讀打印的行是否大于用戶要求的行 while [[ $l -le $[$[$y*2]-1] ]];do #固定行,根據光標所在的列有要求的打印空格或者* if [[ $l -le $[$y-$r] ]];then echo -ne $o elif [[ $l -ge $[$[$[2*$r]+$y]-$r] ]] ;then echo -ne $o else echo -ne $p fi let l++ done echo let r++ l=1 done else echo "please try again" fi
2、用until循環實現國際象棋棋盤
#!/bin/bash # r="\033[41m \033[0m" u="\033[42m \033[0m" l=1 h=1 until [[ $l -gt 8 ]];do until [[ $h -gt 8 ]];do [[ $[$h+$l]%2 -eq 0 ]] && echo -en $r || echo -en $u let h++ done echo h=1 let l++ done
原創文章,作者:hunter,如若轉載,請注明出處:http://www.www58058.com/36368
文章對一些概念的東西進行了羅列,也不解釋這是什么,是用來做什么的,就跟筆記一樣,望以后能該進。