shell編程系列7--shell中經常使用的工具find、locate、which、whereis 1.文件查找之find命令 語法格式:find [路徑] [選項] [操做] 選項 -name 根據文件名查找 -perm 根據文件權限查找 -prune 該選項能夠排除某些查找目錄 -user 根據文件屬主查找 -group 根據文件屬組查找 -mtime -n | +n 根據文件更改時間查找 -nogroup 查找無有效屬組的文件 -nouser 查找無有效屬主的文件 -newer file1 ! file2 -type 按文件類型查找 -size -n +n 按文件大小查找 -mindepth n 從n級子目錄開始搜索 -maxdepth n 最多搜索到n級目錄
find命令總結: 經常使用選項: -name 查找/etc目錄下以conf結尾的文件 find /etc -name "*.conf" -iname 查找當前目錄下文件名爲aa的文件,不區分大小寫 find . -iname aa -user 查找文件屬主爲hdfs的全部文件 find . -user hdfs -group 查找文件屬主爲yarn的全部文件 find . -group yarn -type 查找文件屬組爲yarn的全部文件 find . -group yarn f 文件 find . -type f d 目錄 find . -type d c 字符設備文件 find . -type c b 塊設備文件 find . -type b l 連接文件 find . -type l p 管道文件 find . -type p -size -n 大小小於n的文件 +n 大小大於n的文件 n 大小等於n的文件(用的少) 例子1:查找/etc/目錄下小於10000字節的文件 find /etc -size -10000c 例子2:查找/etc目錄下大於1M的文件 find /etc/ -size +1M -mtime -n n天之內修改的文件 +n n天之外修改的文件 n 正好等於n天修改的文件 例子1:查找/etc目錄下5天之內修改且以conf結尾的文件 find /etc -mtime -5 -name '*.conf' 例子2:查找/etc目錄下10天以前修改且屬主爲root的文件 find /etc -mtime +10 -user root -mmin -n n分鐘之內修改的文件 +n n分鐘之外修改的文件 例子1:查找/etc目錄下30分鐘以前修改的文件 find /etc -mmin +30 例子2:查找/etc目錄下30分鐘之內修改的目錄 find /etc -mmin -30 -type d -mindepth n 表示從n級子目錄開始搜索 例子:在/etc下的3級子目錄開始搜索 find /etc -mindepth 3 -name '*.conf' -maxdepth n 表示最多搜索到n級子目錄 例子1:在/etc下搜索符號條件的文件,但最多搜索到2級子目錄 例子2: find /etc -type f -name '*.conf' -size +10k -maxdepth 2 須要瞭解的選項: -nouser 查找沒有屬主的文件 例子:find . -type f -nouser -nogroup 查找沒有屬組的文件 例子:find . -type f -nogroup -perm 例子:find . -perm 664 -prune 一般和-path一塊兒使用,用於將特定目錄排除在搜索條件以外 例子1:查找當前目錄下全部普通文件,但排除test目錄 find . -path /etc -prune -o -type f 例子2:查找當前目錄下全部普通文件,但排除etc和opt目錄 find . -path /etc -prune -o -path /opt -prune -o -type f 例子3:查找當前目錄下全部普通文件,但排除etc和opt目錄,但屬主爲hdfs find . -path /etc -prune -o -path /opt -prune -o -type f -a -user hdfs 例子4:查找當前目錄下全部普通文件,但排除etc和opt目錄,但屬主爲hdfs,切文件大小必須大於500字節 find . -path ./etc -prune -o -path ./opt -prune -o -type f -a user hdfs -a -size +500c -newer file1 例子1:find /etc -newer a 操做: -print 打印輸出 -exec 對搜索到的文件執行特定的操做,格式爲 -exec 'command' {} \; 例子1:搜索/etc下的文件(非目錄),文件名以conf結尾,且大於10k,而後將其刪除 find ./etc -type f -name "*.conf" -size +10k -exec rm -f {} \; 例子2:將/var/log目錄下以log結尾的文件,且更改時間在7天以上的刪除 find /var/log -name "*.log" -mtime +7 -exec rm -rf {} \; 例子3:搜索條件和例子1同樣,只是不刪除,而是將其拷貝到/root/conf目錄下 find ./etc -size +10k -type f -name "*.conf" -exec cp {} /root/conf/ \; -ok 和exec功能同樣,只是每次操做都會給用戶提示 邏輯運算符: -a 與 -o 或 -not|! 非 例子1:查找當前目錄下,屬主不是hdfs的全部文件 find . -not -user hdfs | find . ! -user hdfs 例子2:查找當前目錄下,屬主屬於hdfs,且大小大於300字節的文件 find . -type f -a -user hdfs -a -size +300c 例子3:查找當前目錄下的屬主爲hdfs或者以xml結尾的普通文件 find . -type f -a \( -user hdfs -o -name '*.xml' \) 示例: 查找以.conf結尾的文件 [root@es01 shell]# find /etc -name '*.conf' /etc/resolv.conf /etc/depmod.d/dist.conf /etc/dracut.conf /etc/prelink.conf.d/nss-softokn-prelink.conf /etc/prelink.conf.d/fipscheck.conf /etc/prelink.conf.d/grub2.conf /etc/modprobe.d/tuned.conf /etc/modprobe.d/firewalld-sysctls.conf /etc/modprobe.d/dccp-blacklist.conf ... # -name 區分大小寫,iname忽略大小寫 [root@es01 dir]# ll total 0 -rw-r--r-- 1 root root 0 May 25 09:42 aa -rw-r--r-- 1 root root 0 May 25 09:42 aA -rw-r--r-- 1 root root 0 May 25 09:42 Aa -rw-r--r-- 1 root root 0 May 25 09:42 AA -rw-r--r-- 1 root root 0 May 25 09:42 etc -rw-r--r-- 1 root root 0 May 25 09:42 test -rw-r--r-- 1 root root 0 May 25 09:42 user.list [root@es01 dir]# find ./ -name 'aa' ./aa [root@es01 dir]# find ./ -iname 'aa' ./aa ./aA ./AA ./Aa # 查找文件 [root@es01 dir]# find ./ -type f ./aa ./aA ./AA ./Aa ./etc ./test ./user.list # 查找/etc/目錄下大於1M的文件 [root@es01 dir]# find /etc -size +1M /etc/udev/hwdb.bin /etc/selinux/targeted/active/policy.kern /etc/selinux/targeted/contexts/files/file_contexts.bin /etc/selinux/targeted/policy/policy.31 # 建立一個1m的文件,並查找大小爲1m的文件 [root@es01 dir]# dd if=/dev/zero of=123 bs=512k count=2 2+0 records in 2+0 records out 1048576 bytes (1.0 MB) copied, 0.000784129 s, 1.3 GB/s [root@es01 dir]# ll -h 123 -rw-r--r-- 1 root root 1.0M May 25 09:52 123 [root@es01 dir]# find . -size 1M . ./123 # 3天內修改的文件 [root@es01 dir]# find /etc/ -mtime -3 /etc/ /etc/resolv.conf /etc/group /etc/gshadow /etc/passwd /etc/shadow /etc/ld.so.cache /etc/logrotate.d /etc/tuned/active_profile /etc/tuned/profile_mode # 查找5天內的.conf文件 [root@es01 dir]# find /etc -mtime -5 -name "*.conf" /etc/resolv.conf /etc/fonts/conf.d/20-unhint-small-dejavu-sans.conf /etc/fonts/conf.d/57-dejavu-sans.conf /etc/fonts/conf.d/10-hinting-slight.conf /etc/fonts/conf.d/10-scale-bitmap-fonts.conf /etc/fonts/conf.d/20-unhint-small-vera.conf /etc/fonts/conf.d/25-unhint-nonlatin.conf # 查找30分鐘內被修改的文件 [root@es01 dir]# find /etc -mmin -30 /etc /etc/group /etc/gshadow /etc/cron.daily /etc/my.cnf /etc/aa.conf # 查找2級子目錄查找文件 [root@es01 dir]# find . -mindepth 2 -type f ./test1/nginx/fastcgi.conf ./test1/nginx/fastcgi.conf.default ./test1/nginx/fastcgi_params ./test1/nginx/fastcgi_params.default ./test1/nginx/koi-utf ./test1/nginx/koi-win ./test1/nginx/mime.types ./test1/nginx/mime.types.default ./test1/nginx/nginx.conf ./test1/nginx/nginx.conf.default ./test1/nginx/scgi_params ./test1/nginx/scgi_params.default ./test1/nginx/uwsgi_params ./test1/nginx/uwsgi_params.default ./test1/nginx/win-utf # 最深查找1級子目錄的文件 [root@es01 dir]# find . -maxdepth 1 -type f ./aa ./aA ./AA ./Aa ./etc ./test ./user.list ./123 # 查找644權限的文件 [root@es01 dir]# find . -perm 644 ./aa ./aA ./AA ./Aa ./etc ./test ./user.list ./123 # 排除 test1/nginx 目錄後的文件 [root@es01 dir]# find . -path ./test1/nginx -prune -o -type f ./aa ./aA ./AA ./Aa ./etc ./test ./user.list ./123 ./test1/nginx # 查找排除 test_1 和 test1 之後的文件 [root@es01 dir]# find . -path ./test_1 -prune -o -path ./test1 -prune -o -type f ./aa ./aA ./AA ./Aa ./etc ./test ./user.list ./123 ./test1 ./test_1 ./test_2/ccc ./test_2/ddd # 查找當前目錄下比123 新的文件 [root@es01 dir]# find ./ -newer 123 ./ ./test1 ./test1/dir_3 ./test1/dir_3/dir_4 ./test_1 ./test_1/bbb ./test_1/aaa ./test_2 ./test_2/ccc ./test_2/ddd # 將etc目錄拷貝到當前目錄,查找etc目錄中的.conf文件並刪除 [root@es01 dir]# cp -r /etc ./ [root@es01 dir]# ls 123 aa aA Aa AA etc fff test test1 test_1 test_2 user.list [root@es01 dir]# find ./etc -name '*.conf' -exec rm -f {} \; [root@es01 dir]# find ./etc -name '*.conf' [root@es01 dir]# # 將etc目錄下大於1m的文件拷貝到test_5目錄下 [root@es01 dir]# find ./etc/ -size +1M ./etc/udev/hwdb.bin ./etc/selinux/targeted/active/policy.kern ./etc/selinux/targeted/contexts/files/file_contexts.bin ./etc/selinux/targeted/policy/policy.31 [root@es01 dir]# mkdir test_5 [root@es01 dir]# find ./etc -size +1M -exec cp {} ./test_5/ \; [root@es01 dir]# ls test_5 file_contexts.bin hwdb.bin policy.31 policy.kern # -ok 提示用戶是否執行操做 [root@es01 dir]# find ./ -type f -ok rm -f {} \; < rm ... ./aa > ? y < rm ... ./aA > ? y < rm ... ./AA > ? n < rm ... ./Aa > ? find、locate、whereis和which總結及適用場景分析 locate命令介紹 文件查找命令,所屬軟件包mlocate 不一樣於find命令是在整塊磁盤中搜索,locate命令在數據庫文件中查找 find默認所有匹配,locate則是默認部分匹配 updatedb命令:用戶更新/var/lib/mlocate/mlocate.db 文件 所使用配置文件/etc/updatedb.conf 該命令在後臺cron計劃任務中按期執行 # find是精確查找 [root@es01 dir]# find /etc -name 'my.cnf' /etc/my.cnf # locate部分匹配 [root@es01 dir]# locate my.cnf /etc/my.cnf /etc/my.cnf.d /etc/my.cnf.d/mysql-clients.cnf # 即時建立的文件用locate是查找不到的,由於系統有計劃任務定時更新mlocate.db文件,若是不包含是查找不到文件的 [root@es01 ~]# touch abc.txt [root@es01 ~]# touch def.txt [root@es01 ~]# locate abc.txt [root@es01 ~]# locate def.txt # 更新數據庫就能夠查找到文件了 [root@es01 ~]# ll -h /var/lib/mlocate/mlocate.db -rw-r----- 1 root slocate 3.0M May 25 10:01 /var/lib/mlocate/mlocate.db [root@es01 ~]# updatedb [root@es01 ~]# locate abc.txt /root/abc.txt [root@es01 ~]# locate def.txt /root/def.txt [root@es01 ~]# ll -h /var/lib/mlocate/mlocate.db -rw-r----- 1 root slocate 3.1M May 25 11:01 /var/lib/mlocate/mlocate.db whereis命令 選項 -b 只返回二進制文件 -m 只返回幫助文檔文件 -s 只返回源代碼文件
[root@es01 ~]# whereis mysql mysql: /usr/bin/mysql /usr/lib64/mysql /usr/share/mysql /usr/share/man/man1/mysql.1.gz # 只查找二進制文件 [root@es01 ~]# whereis -b mysql mysql: /usr/bin/mysql /usr/lib64/mysql /usr/share/mysql # 只查找man文檔 [root@es01 ~]# whereis -m mysql mysql: /usr/share/man/man1/mysql.1.gz which命令 做用:僅查找二進制程序文件 選項 -b 只返回二進制文件 [root@es01 ~]# which mysql /usr/bin/mysql 各命令使用場景推薦 命令 適用場景 優缺點 find 查找某一類文件,好比文件名部分一致 功能強大,速度慢 locate 只能查找單個文件 功能單一,速度快 whereis 查找程序的可執行文件、幫助文檔等 不經常使用 which 只查找程序的可執行文件 經常使用於查找程序的絕對路徑