Linux如何在目錄下靈活建立、瀏覽、刪除百萬個檔案

misakivv發表於2024-05-27

目錄
  • 一、建立百萬級小檔案
    • 1、單核CPU情況
    • 2、多核CPU情況
    • 3、執行效率對比
      • 3.1、單核的順序執行
      • 3.2、多核的併發執行
  • 二、如何列出/瀏覽這些檔案
    • 1、檢視目錄下檔案的數量
    • 2、列出?
    • 3、ls -f(關閉排序功能)
      • 3.1、執行效率對比
    • 4、透過重定向匯入到檔案中瀏覽對應的檔名
  • 三、如何快速刪除目錄下所有檔案
    • 1、rm -f ./* ?
    • 2、將整個目錄名作為引數傳遞給rm命令
    • 3、使用find配合-delete引數
  • 四、需要保留指定檔案怎麼辦
    • 1、建立一個檔案列出需要保留的檔名(一行一個檔名)
    • 2、建立一個名為empty的空目錄
    • 3、使用rsync命令
      • 3.1、命令詳解
    • 4、檢查源目錄是否保留了指定檔案

一、建立百萬級小檔案

1、單核CPU情況

seq 1000000 |xargs -i dd if=/dev/zero of={}.data bs=1024 count=1 &> /dev/null
#生成一百萬個大小為1KB、內容全為零的檔案

seq 1000000 |xargs -i dd if=/dev/urandom of={}.data bs=1024 count=1 &> /dev/null
#生成一百萬大小為1KB,內容為隨機資料的檔案
  • 首先透過seq 1000000生成從1到1000000的序列

  • | (管道符號): 將前面命令的輸出作為後面命令的輸入。

  • xargs: 是一個用於將輸入行轉換為命令列引數的工具。

  • -i: 選項告訴xargs將輸入行中的佔位符(預設是{} )替換為輸入行的內容。

  • dd是一個強大的複製和轉換資料的命令。

  • if=/dev/null:指定/dev/zero作為輸入檔案,這是一個無限量供應位元組流的特殊檔案,所有讀取操作都會返回零值位元組

  • if=/dev/urandom: 指定了輸入檔案為/dev/urandom,這是一個生成隨機數的裝置檔案,可以提供隨機資料。

  • of={}.data: 指定了輸出檔案的格式,其中{}會被seq生成的數字依次替換,形成如1.data2.data這樣的檔名

  • bs=1024: 設定每次讀寫的塊大小為1024位元組。

  • count=1: 指定只讀寫一次塊,因此每個檔案的大小是1KB。

  • >> /dev/null 2>&1: 這部分重定向了命令的所有輸出(標準輸出和錯誤輸出)到/dev/null。這意味著不論是正常輸出還是錯誤資訊都不會顯示在終端上。

2、多核CPU情況

seq 1000000 |xargs -i -P 0 dd if=/dev/zero of={}.data bs=1024 count=1 &> /dev/null
#生成一百萬個大小為1KB、內容全為零的檔案

seq 1000000 |xargs -i -P 0 dd if=/dev/urandom of={}.data bs=1024 count=1 &> /dev/null
#生成一百萬大小為1KB,內容為隨機資料的檔案

-P 0選項指定了儘可能多地開啟併發程序數量

如果要保證最高效率,應當設定併發程序數量等於cpu的核心數量

3、執行效率對比

3.1、單核的順序執行

time seq 1000 |xargs -i dd if=/dev/urandom of={}.data bs=1024 count=1 &> /dev/null

image-20240527163032408

3.2、多核的併發執行

time seq 1000 |xargs -i -P 4 dd if=/dev/urandom of={}.data bs=1024 count=1 &> /dev/null

image-20240527163335036

二、如何列出/瀏覽這些檔案

1、檢視目錄下檔案的數量

ls | wc -l

image-20240527163628645

2、列出?

一般情況下我們會直接使用ls進行列出處理

ls
image-20240527164226494
image-20240527164419393

但是不難看出鍵入ls命令後終端會卡住

最後所有的檔名會一次性列印在終端的螢幕上

3、ls -f(關閉排序功能)

預設ls命令會在記憶體中對輸出的檔案進行排序

[root@localhost test]# man ls | grep -w "\-f"
       -f     do not sort, enable -aU, disable -ls --color

3.1、執行效率對比

[root@localhost test]# time ls &> /dev/null

real    0m1.394s
user    0m0.906s
sys     0m0.488s
[root@localhost test]# time ls -f &> /dev/null

real    0m0.233s
user    0m0.136s
sys     0m0.097s

image-20240527165030866

4、透過重定向匯入到檔案中瀏覽對應的檔名

ls -1 -f > /tmp/filelist.txt

-1:一行一個檔名

-f:關閉排序功能

image-20240527165511409

透過less、more、vim等工具進行瀏覽和搜尋

三、如何快速刪除目錄下所有檔案

1、rm -f ./* ?

rm -rf ./*

image-20240527170109543

很顯然,rm的引數列表過長,無法執行rm命令

2、將整個目錄名作為引數傳遞給rm命令

rm -rf test

image-20240527170416560

3、使用find配合-delete引數

find /test/ -mindepth 1 -delete

image-20240527171453853

這條命令會從指定目錄開始,查詢所有非目錄項(即檔案)並刪除它們。

-mindepth 1 確保不刪除當前目錄本身,以防萬一你需要保留該目錄結構以便後續檢查或操作。

四、需要保留指定檔案怎麼辦

1、建立一個檔案列出需要保留的檔名(一行一個檔名)

[root@localhost ~]# cd /tmp/
[root@localhost tmp]# cat > reserved_list.txt <<EOF
> 6.data
> 66.data
> 666.data
> 6666.data
> 66666.data
> EOF

#在一個乾淨的目錄下建立

2、建立一個名為empty的空目錄

[root@localhost tmp]# mkdir empty

3、使用rsync命令

[root@localhost ~]# rsync -av --delete /tmp/empty/ /test/ --exclude-from=/tmp/reserved_list.txt

image-20240527180039396

3.1、命令詳解

image-20240527183757314

  • rsync: 是一個用於檔案傳輸和資料備份的高效工具,它可以映象本地或遠端系統上的檔案和目錄,並且可以高效地更新差異部分。
  • -av: 這裡有兩個選項:
    • -a--archive 是一個綜合選項,意味著進行歸檔模式的複製,它保留了 symbolic links, devices, permissions, owner, groups, timestamps, 和其它檔案屬性,並遞迴地複製目錄。
    • -v--verbose 表示詳細模式,會讓 rsync 在執行時輸出更多的資訊,比如哪些檔案正在被傳輸。
  • --delete: 這個選項指示 rsync 它會讓目標目錄(/test/)與源目錄(/tmp/empty/)保持一致,移除目標目錄中多餘的檔案。
  • /tmp/empty/: 源目錄,這是一個假設為空的目錄。因為源目錄是空的,結合 --delete 選項,實際上會導致目標目錄 /test/ 中的所有內容被刪除(除非有排除規則)。
  • /test/: 目標目錄,你想同步到或依據源目錄進行清理的目錄。
  • --exclude-from=/tmp/reserved_list.txt: 這個選項指定了一個檔案列表,其中包含了不想被刪除或同步的檔案/目錄的模式。rsync 會讀取 /tmp/reserved_list.txt 檔案中的每一行作為排除模式,確保這些模式匹配到的檔案或目錄不會被刪除。

整個命令的意思是:以歸檔模式並且詳細輸出的形式,同步空目錄 /tmp/empty/ 到目錄 /test/,在同步過程中刪除目標目錄中源目錄不存在的檔案,但排除 /tmp/reserved_list.txt 檔案中列出的檔案或目錄不被刪除。這是一種清理或重置目錄結構的方法,同時保留特定的“保留”檔案或目錄不被刪除。

4、檢查源目錄是否保留了指定檔案

ls /test/

image-20240527180105082

相關文章