檔案查詢

Linux小菜鸟發表於2024-11-18

作用: 根據不同的檔案型別查詢出想要的檔案

語法結構:
		 find 在哪裡找 找什麼型別的   # 格式1
		 find  /data  f            
		 find  /data  按照名稱查詢   # 格式2

【1】、常用檔案型別

檔案型別:
f   # 表示普通檔案 
d   # 表示目錄
l   # 表示連結檔案
c   # 表示位元組裝置 
b   # 表示塊裝置 /dev/sda  磁碟 光碟機 


1、/dev/urandom

位元組裝置:
urandom #作用 不停的往外吐 沒啥用
[root@oldboyedu ~]# ll /dev/urandom 
crw-rw-rw- 1 root root 1, 9 11月 16 12:29 /dev/urandom

2、/dev/null

/dev/null #作用 可以將命令的結果定向到此檔案 空 類似黑洞 只吃不拉
[root@oldboyedu ~]# echo hehe > /dev/null
[root@oldboyedu ~]# cat /dev/null
[root@oldboyedu ~]# echo hehe >> /dev/null 
[root@oldboyedu ~]# cat /dev/null

作用: 寫指令碼執行命令的時候,會根據自己想要輸出的內容來定義輸出格式。
[root@oldboyedu ~]# ping -c1 -W1 www.sina.com &>/dev/null
[root@oldboyedu ~]# echo $?
0
[root@oldboyedu ~]# ping -c1 -W1 www.sinsssssssssa.com &>/dev/null
[root@oldboyedu ~]# echo $?
2
# shell指令碼
ping -c1 -w1 www.baidu.com &>/dev/null

if [ $? -eq 0 ]; then
        echo "百度線上"
else
        echo "百度不線上"
fi

3、/dev/zero

[root@kylin-xu ~]# dd if=/dev/zero of=./1.txt bs=1M count=1000
記錄了1000+0 的讀入
記錄了1000+0 的寫出
1048576000位元組(1.0 GB,1000 MiB)已複製,16.5751 s,63.3 MB/s
[root@kylin-xu ~]# ll 1.txt 
-rw-r--r-- 1 root root 1048576000 11月 13 10:43 1.txt
[root@kylin-xu ~]# ll 1.txt  -h
-rw-r--r-- 1 root root 1000M 11月 13 10:43 1.txt
dd  # 命令
if  # input file  輸入檔案 /dev/zero輸入內容
of  # ouput file  輸出到哪個檔案 1.txt 中
bs  # 每次讀取的大小 bs=1M 每次在/dev/zero中讀取1M的資料
count # 總共讀多少次 
#透過dd生成一個10M的檔案
[root@oldboyedu ~]# dd if=/dev/zero  of=./2.txt bs=1M count=10

【2】、查詢檔案

find檔案查詢
作用: 查詢檔案
1.查詢大檔案
2.小檔案多的 
  inode號,一個檔案最少佔用一個inode和一個block
  相當於一本書的索引,一本書的目錄有限制的 比如200個
3.模糊查詢
4.按照時間查詢
檢視inode使用
[root@kylin-xu ~]# df -i
檔案系統                  Inodes 已用(I)  可用(I) 已用(I)% 掛載點
devtmpfs                  246341     475   245866       1% /dev
tmpfs                     250387       1   250386       1% /dev/shm
tmpfs                     250387     721   249666       1% /run
tmpfs                     250387      17   250370       1% /sys/fs/cgroup
/dev/mapper/klas-root   20066304  124968 19941336       1% /
tmpfs                     250387      12   250375       1% /tmp
/dev/mapper/klas-backup  9795584       8  9795576       1% /backup
/dev/sda1                 524288     340   523948       1% /boot
tmpfs                     250387       6   250381       1% /run/user/0

1、安裝檔案型別進行查詢

find:
	  find  ./ -type f  # 按照檔案型別查詢
	  find ./ -type f -o -type d # 使用或者關係查詢
	  
-o  or # 或者
-a  and# 並且 預設就是並且關係
案例1.find按照檔案型別查詢出所有的普通檔案
[root@kylin-xu find]# find ./ -type f 
./test-1/1.txt
./test-1/2.txt
./test-1/3.txt
./test-2/1.TXT
./test-2/2.TXT
./test-2/3.TXT
./a.txt
./b.txt

案例2.查詢出所有的目錄檔案
[root@kylin-xu find]# find ./ -type d
./
./test-1
./test-2
./test-3

其他型別查詢
find / -type l
find / -type b
find / -type c

案例3.查詢出檔案或者是目錄的
[root@kylin-xu find]# find ./ -type f -o -type d
./
./test-1
./test-1/1.txt
./test-1/2.txt
./test-1/3.txt
./test-2
./test-2/1.TXT
./test-2/2.TXT
./test-2/3.TXT
./a.txt
./b.txt
./test-3

2、按照檔名字進行查詢

案例1.查詢出檔名稱1.txt的
[root@kylin-xu find]# find ./ -name 1.txt
./test-1/1.txt

案例2.不區分大小寫使用 -iname
[root@kylin-xu find]# find ./ -iname 1.txt
./test-1/1.txt
./test-2/1.TXT

案例3.使用萬用字元 * 表示所有,?表示一個字元
[root@kylin-xu find]# find ./ -name "[21].txt"
./test-1/1.txt
./test-1/2.txt
[root@kylin-xu find]# find ./ -name "[0-9].txt"
./test-1/1.txt
./test-1/2.txt
./test-1/3.txt
[root@kylin-xu find]# find ./ -name "[0-9a-Z].txt"
./test-1/1.txt
./test-1/2.txt
./test-1/3.txt
./a.txt
./b.txt
[root@kylin-xu find]# find ./ -name "?.txt"
./test-1/1.txt
./test-1/2.txt
./test-1/3.txt
./a.txt
./b.txt
[root@kylin-xu find]# find ./ -name "*.*"
./
./test-1/1.txt
./test-1/2.txt
./test-1/3.txt
./test-2/1.TXT
./test-2/2.TXT
./test-2/3.TXT
./a.txt
./b.txt
./12.txt

3、find使用並且和或者查詢檔案

案例1.查詢出普通檔案並且名稱為1.txt的
[root@kylin-xu find]# find ./ -type f -a -name 1.txt
./test-1/1.txt

案例2.查詢出目錄並且名稱是test-1
[root@kylin-xu find]# find ./ -type d -a -name test-1
./test-1

案例3.查詢出檔名稱*.txt 或者 *.log
[root@kylin-xu find]# find ./ -name "*.txt" -o -name  "*.log"
./test-1/1.txt
./test-1/2.txt
./test-1/3.txt
./a.txt
./b.txt
./12.txt

案例4.按照深度等級查詢
[root@kylin-xu find]# find  ./ -maxdepth 1 -name "*.txt" -o -name  "*.log" 
./a.txt
./b.txt
./12.txt

4、按照inode號查詢

[root@kylin-xu find]# ll -i
總用量 0
102615330 -rw-r--r-- 1 root root  0 11月 13 11:36 12.txt
102615328 -rw-r--r-- 1 root root  0 11月 13 11:08 a.txt
102615329 -rw-r--r-- 1 root root  0 11月 13 11:08 b.txt
  1781175 drwxr-xr-x 2 root root 84 11月 13 11:55 test-1
 34853858 drwxr-xr-x 2 root root 45 11月 13 11:08 test-2
 67723713 drwxr-xr-x 2 root root  6 11月 13 11:08 test-3
[root@kylin-xu find]# find ./ -inum 102615330
./12.txt
[root@kylin-xu find]# find ./ -inum 102615330 | xargs rm
[root@kylin-xu find]# ll
總用量 0
-rw-r--r-- 1 root root  0 11月 13 11:08 a.txt
-rw-r--r-- 1 root root  0 11月 13 11:08 b.txt
drwxr-xr-x 2 root root 84 11月 13 11:55 test-1
drwxr-xr-x 2 root root 45 11月 13 11:08 test-2
drwxr-xr-x 2 root root  6 11月 13 11:08 test-3

5、find按照大小查詢檔案

語法格式:
		 find ./ -size 10M  # 查詢出等於10M的檔案
		 find ./ -size +10M # 查詢出大於10M的檔案
		 find ./ -size -10M # 查詢出小於10M的檔案
案例1.查詢出大於10M的檔案 
[root@kylin-xu find]# find ./ -size +10M 
./1.txt

案例2.查詢出等於10M的檔案
[root@kylin-xu find]# find ./ -size 10M 
./2.txt

案例3.查詢出小於10M的檔案
[root@kylin-xu find]# find ./ -size -10M 

案例4.查詢出等於10M或者大於10M的檔案
[root@kylin-xu find]# find ./ -size 10M -o -size +10M
./1.txt
./2.txt

# 注意預設就是並且關係可以省略 -a  -o不能省略
案例5.查詢出普通檔案並且大於10M的檔案
[root@kylin-xu find]# find ./ -type f  -o -size +10M

案例6.查詢出檔案大於5M 並且小於15M的
[root@kylin-xu find]# find ./ -type f  -a  -size +5M -a -size  -15M
./2.txt

案例7.查詢出大於1M的目錄 #一般來說不會存在,如果目錄大於1M 說明下面已經存在5萬+的小檔案
[root@kylin-xu find]# find / -type d -size +1M

統計目錄及下所有大小
[root@kylin-xu find]# du /etc/ -sh
25M     /etc/

6、按照時間查詢檔案

語法格式:
三種時間:
atime: 訪問時間
mtime: 檔案修改時間
ctime: 檔案屬性修改時間
		 find  ./ -mtime +7   # 7天前修改過的檔案
		 find ./ -mtime  -7   # 7天內修改過的檔案
		 find ./ -mtime  0     # 24小時內被修改過的檔案
[root@kylin-xu find]# stat 1.txt 
  檔案:“1.txt”
  大小:1048576000      塊:2048000    IO 塊:4096   普通檔案
裝置:fd00h/64768d      Inode:102615330   硬連結:1
許可權:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
最近訪問:2024-11-13 12:03:00.507104942 -0300
最近更改:2024-11-13 12:03:11.399051736 -0300
最近改動:2024-11-13 12:03:11.399051736 -0300
建立時間:-
案例1.查詢24小時內被修改過的檔案
find / -mtime 0

案例2.查詢出修改時間大於30天前的檔案
find / -type f -mtime +30

案例3.查詢出修改時間大於30天前所有的檔案
find / -mtime +30
[root@kylin-xu find]# date -s 20080302
2008年 03月 02日 星期日 00:00:00 -03
[root@kylin-xu find]# touch 2008{1..3}.txt
[root@kylin-xu find]# mkdir  2008{1..3}
[root@kylin-xu find]# ntpdate ntp2.aliyun.com
17 Nov 12:02:02 ntpdate[237947]: step time server 203.107.6.88 offset +527428869.143752 sec
[root@kylin-xu find]# find ./ -mtime +30
./
./20081.txt
./20082.txt
./20083.txt
./20081
./20082
./20083

時間查詢的作用:
1.大於7天或者30天前的檔案不用了需要備份或者刪除
2.系統中毒 檔案被篡改。

筆試題: 查詢/data目錄下所有的普通檔案修改時間大於30天前的然後刪除

【3】、將find的結果交給其他命令

1、xargs

案例1.找出檔名稱3.txt的然後檢視裡面的內容
[root@kylin-xu find]# find ./ -name 3.txt | xargs cat
aaa
為什麼不用ll 因為xargs後面所有的別名失效。


# xargs: 將前面命令執行的結果 甩到所有命令的最後面、
# xargs可以格式化輸出 按n列的方式 預設以空格分隔
# |xargs -n1  # 按1列的方式輸出內容

案例2.查詢名稱3.txt的檔案然後刪除
[root@kylin-xu find]# find ./ -name 3.txt | xargs rm 

案例3.查詢名稱1.txt的檔案然後複製到/opt目錄
[root@kylin-xu find]# find ./ -name 1.txt | xargs -i cp {} /opt/
[root@kylin-xu find]# ll /opt/1.txt 
-rw-r--r-- 1 root root 1048576000 11月 17 12:22 /opt/1.txt

案例4.查詢名稱1.txt 然後移動到/tmp目錄
[root@kylin-xu find]# find ./ -name 1.txt | xargs -i mv {} /tmp/

案例5.複製多個檔案到/opt目錄
find ./ -name "*.txt" | xargs -i cp {} /opt

2、-exec

案例1.交給cat命令
[root@kylin-xu find]# find ./ -name 1.log -exec cat {} \;
aaa

案例2.交給cp動作
[root@kylin-xu find]# find ./ -name 1.log -exec cp  {} /opt \;
[root@kylin-xu find]# ll /opt/1.log 
-rw-r--r-- 1 root root 4 11月 17 12:31 /opt/1.log

案例3.交給rm動作
[root@kylin-xu find]# find ./ -name *.log -exec rm  {}  \;
[root@kylin-xu find]# find ./ -name *.log 
[root@kylin-xu find]# 

案例4.查詢出所有大寫的.TXT結尾的檔案 然後打包成test.tar.gz
[root@kylin-xu find]# find ./ -name *.TXT   -exec tar -zcvf test.tar.gz {} \;
./test-2/1.TXT
./test-2/2.TXT
./test-2/3.TXT
[root@kylin-xu find]# tar tf test.tar.gz 
./test-2/3.TXT

[root@kylin-xu find]# find ./ -name *.TXT | xargs tar zcvf a.tar.gz
./test-2/1.TXT
./test-2/2.TXT
./test-2/3.TXT
[root@kylin-xu find]# tar tf a.tar.gz 
./test-2/1.TXT
./test-2/2.TXT
./test-2/3.TXT
# 如果使用 -exec 去進行壓縮,他只會壓縮最後查詢的內容
# 使用 xargs 進行壓縮,就是全部完整的內容,因此在進行壓縮操作時我們不會使用 -exec 引數

3、``或$()

案例1.將查詢到的檔案交給cp命令
cp `find ./ -name "*.txt"`  /opt


案例2.將查詢到的檔案交給ll命令
ll $(find ./ -name "1.txt")

案例3.交給cat命令
cat `find ./ -name "2.txt"`

案例4.複製查詢到的所有檔案到/root
cp $(find ./ -size +10K) /root

案例5.查詢到的檔案交給rm命令
rm -f $(find ./ -size -10M)

相關文章