好程式設計師雲端計算學習路線分享雲端計算之檔案查詢

好程式設計師IT發表於2019-09-24

好程式設計師雲端計算學習路線系列分享雲端計算之 檔案查詢


grep: 檔案內容過濾
find: 檔案查詢,針對檔名

一、命令檔案
# which ls //從PATH環境變數 (echo $PATH)
# whereis vim

[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/htop/bin/:/root/bin

二、任意檔案
A. locate  (查詢的資料庫: /var/lib/mlocate/mlocate.db)
計劃任務:每天自動更新資料庫  /etc/cron.daily/mlocate.cron
手動更新資料庫:updatedb
# locate ifcfg-eth0
# locate ifcfg-enp0s25
locate

updatedb後才能查詢到 非常麻煩 不建議使用
如果沒有 locate 使用YUM直接安裝是不行的。 要查一下在哪個包裡 yum provides locate -→ mlocate → 直接YUM mlocate即可
B. find  
find [options] [path...] [ expression ] [action]

=== expression === 熟用*萬用字元
按檔名:
[root@tianyun ~]# find /etc -name "ifcfg-eth0"  name 名字 後面-print 已省略
[root@tianyun ~]# find /etc -iname "ifcfg-eth0"  //-i忽略大小寫
[root@tianyun ~]# find /etc -iname "ifcfg-eth*"

按檔案大小:
[root@tianyun ~]# find /etc -size +5M  //大於5M
[root@tianyun ~]# find /etc -size 5M
[root@tianyun ~]# find /etc  -size -5M
[root@tianyun ~]# find /etc -size +5M  -ls  //-ls找到的處理動作 不是平時用的ls
ll - h 檢視大小

指定查詢的目錄深度:
-maxdepth levels
-mindepth levels
[root@tianyun ~]# find /  -maxdepth 3   -a -name "ifcfg-eth0"  maxdepth 3 最大3層 a要滿足2個條件 並且
時間找(atime,mtime,ctime):
[root@tianyun ~]# find /etc -mtime +5  //修改時間超過5天
[root@tianyun ~]# find /etc  -mtime 5  //修改時間等於5天
[root@tianyun ~]# find /etc -mtime -5  //修改時間5天以內


按檔案型別:
[root@tianyun ~]# find /dev -type f  //f普通
[root@tianyun ~]# find /dev -type d  //d目錄
[root@tianyun ~]# find /dev -type l  //l連結
[root@tianyun ~]# find /dev -type b  //b塊裝置
[root@tianyun ~]# find /dev -type c  //c字元裝置
[root@tianyun ~]# find /dev -type s  //s套接字
[root@tianyun ~]# find /dev -type p  //p管道檔案

按檔案許可權:
[root@tianyun ~]# find . -perm 644  -ls .是當前目錄 精確查詢644 *一般都是精確


[root@tianyun ~]# find . -perm - 644  -ls -是包含到意思

帶不帶- 自己對比一下 檢視。 帶-表示只要6就可以
[root@tianyun ~]# find . -perm - 600  -ls
[root@tianyun ~]# find . -perm - 222  -ls //全域性可寫
[root@tianyun ~]# find /usr/bin /usr/sbin -perm - 4000  -ls //包含set uid
[root@tianyun ~]# find /usr/bin /usr/sbin -perm - 2000  -ls //包含set gid
[root@tianyun ~]# find /usr/bin /usr/sbin -perm - 1000  -ls //包含sticky


== 找到後處理的動作 ACTIONS:   (預設動作-print)==
-print
-ls
-delete
-exec 後面跟自定義的shell命令
-ok 後面跟自定義的shell命令
[root@tianyun ~]# find /etc -name "ifcfg*"   後可以加 |xargs  -h
[root@tianyun ~]# find /etc -name "ifcfg*"   -print
[root@tianyun ~]# find /etc -name "ifcfg*"   -ls

[root@tianyun ~]# find /etc -name "ifcfg*" -exec cp -rvf {} /tmp \;
[root@tianyun ~]# find /etc -name "ifcfg*" -ok cp -rvf {} /tmp \;


exec 命令用於呼叫並執行指令的命令

查詢帶root帶檔案 複製到tmp下

find /etc -name “root*” -exec cp -rf {} /tmp \; 複製到當前檔案下 /tmp換成.
[root@tianyun ~]# find /etc -name "ifcfg*"   -exec  rm -rf {} \;  exec為執行一條shell命令 {}為前面的東西\; 格式
[root@tianyun ~]# find /etc -name "ifcfg*"   -delete

擴充套件知識:find結合xargs
[root@tianyun ~]# find . -name "yang*.txt"   |xargs  rm -rf !!!!!!!!!!!!!重點 找到之後刪除處理xargs 引數傳遞處理找出後刪除
[root@tianyun ~]# find /etc -name "ifcfg-eth0"   |xargs -I {}  cp -rf {}  /var/tmp



案例1:   分別找出file5 和除了file5的檔案
[root@tianyun ~]# mkdir dir1
[root@tianyun ~]# touch dir1/file{1..20}

[root@tianyun ~]# find /root/dir1 -name "file5"
[root@tianyun ~]# find /root/dir1 !  -name "file5" !為取反

[root@tianyun ~]# find /root/dir1 -name "file5" -o -name "file9" 即是file5又是file9
/root/dir1/file5
/root/dir1/file9

擴充套件 不常用

[root@tianyun ~]# find /root/dir1 -name "file5" -o -name "file9" -ls
1466515 0 -rw-r--r-- 1 root root 0 6月 5 11:15 /root/dir1/file9

[root@tianyun ~]# find /root/dir1 -name "file5" -ls  -o -name "file9" -ls
1466499 0 -rw-r--r-- 1 root root 0 6月 5 11:15 /root/dir1/file5
1466515 0 -rw-r--r-- 1 root root 0 6月 5 11:15 /root/dir1/file9

[root@tianyun ~]# find /root/dir1 \(  -name "file5" -o -name "file9" \)   -ls  \為轉譯 不加會報錯
1466499 0 -rw-r--r-- 1 root root 0 6月 5 11:15 /root/dir1/file5
1466515 0 -rw-r--r-- 1 root root 0 6月 5 11:15 /root/dir1/file9

[root@localhost ~]# find /root/dir1 \( -name "file5" -o -name "file9" \)  -exec rm -rvf {} \;
removed ‘/root/dir1/file5’
removed ‘/root/dir1/file9’

-exec和xargs的區別


2010-11-27 星期六 晴朗當你在命令列執行:
$find . -name 'core' -type f -exec rm {} /;
時,find -exec 命令會對每個匹配的檔案執行一個單獨的rm操作(execute a separate rm for each one), 正如你手動敲入下面命令:
rm ./bin/core
rm ./source/shopping_cart/core
rm ./backups/core
...但是使用這種方式,如果有100個檔案匹配了,那麼就需要啟100個程式,一個程式處理一個rm命令。一般來說,其越多程式,意味著越耗效能。我們可以換個思路,我們將要刪除檔案當作引數傳遞給rm不就可以了嗎?也就是說:
rm ./bin/core
rm ./source/shopping_cart/core
rm ./backups/core
...改成:
rm ./bin/core ./source/shopping_cart/core ./backups/core但是前提是後面的命令必須支援多引數。相有些命令,比如unzip,就不支援輸入多個jar包,所以必須用-exec。
xargs,顧名思義,是對引數進行處理的命令。它的任務就是將輸入行轉換成下一個命令的引數列表。因此上面的find -exec命令可以改寫成:
find . -name 'core' -type f -print | xargs rmWith this approach, xargs bundles together as many filename arguments as possible for submission to each invocation of rm that's needed, in compliance with the OS's maximum allowed size for an argument list. This means xargs is guaranteed not only to handle all the arguments, but also to use the smallest possible number of processes in doing so. For example, if each command can handle 100 arguments, and there are 110 filenames to process, there will be two invocations of the command, respectively handling 100 and 10 arguments.
其中作業系統允許的最大引數長度由如下命令得到:
forrest@ubuntu:~$ getconf ARG_MAX
2097152這意味著xargs保證不會因為引數過多而掛掉。所以目前看來唯一需要保證的就是後面的命令支援多引數。比如前面說過的unzip,就不支援多引數,如果你使用xargs xxx.jar

相比之下,也不難看出各自的缺點
1、exec 每處理一個檔案或者目錄,它都需要啟動一次命令,效率不好; 
2、exec 格式麻煩,必須用 {} 做檔案的代位符,必須用 \; 作為命令的結束符,書寫不便。
3、xargs 不能操作檔名有空格的檔案;

綜上,如果要使用的命令支援一次處理多個檔案,並且也知道這些檔案裡沒有帶空格的檔案,
那麼使用 xargs比較方便; 否則,就要用 exec了。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913892/viewspace-2658051/,如需轉載,請註明出處,否則將追究法律責任。

相關文章