Linux如何在目錄下靈活創建、瀏覽、刪除百萬個文件

来源:https://www.cnblogs.com/misakivv/p/18216291
-Advertisement-
Play Games

目錄一、創建百萬級小文件1、單核CPU情況2、多核CPU情況3、執行效率對比3.1、單核的順序執行3.2、多核的併發執行二、如何列出/瀏覽這些文件1、查看目錄下文件的數量2、列出?3、ls -f(關閉排序功能)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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 作為後端工程師,多數情況都是給別人提供介面,寫的好不好使你得重視起來。 最近我手頭一些活,需要和外部公司對接,我們需要提供一個介面文檔,這樣可以節省雙方時間、也可以防止後續扯皮。這是就要考驗我的介面是否規範化。 1. 介面名稱清晰、明確 顧名思義,介面是做什麼的,是否準確、清晰?讓使用這一眼就能知道 ...
  • SpringBoot筆記 SpringBoot文檔 官網: https://spring.io/projects/spring-boot 學習文檔: https://docs.spring.io/spring-boot/docs/current/reference/html/ 線上API: http ...
  • 一、背景說明 1.1 效果演示 用python開發的爬蟲採集軟體,可自動抓取抖音評論數據,並且含二級評論! 為什麼有了源碼還開發界面軟體呢?方便不懂編程代碼的小白用戶使用,無需安裝python、無需懂代碼,雙擊打開即用! 軟體界面截圖: 爬取結果截圖: 以上。 1.2 演示視頻 軟體運行演示視頻:見 ...
  • @DateTimeFormat 和 @JsonFormat 是 Spring 和 Jackson 中用於處理日期時間格式的註解,它們有不同的作用: @DateTimeFormat @DateTimeFormat 是 Spring 框架提供的註解,用於指定字元串如何轉換為日期時間類型,以及如何格式化日 ...
  • OpenAPI 規範是用於描述 HTTP API 的標準。該標準允許開發人員定義 API 的形狀,這些 API 可以插入到客戶端生成器、伺服器生成器、測試工具、文檔等中。儘管該標準具有普遍性和普遍性,但 ASP.NET Core 在框架內預設不提供對 OpenAPI 的支持。 當前 ASP.NET ...
  • 不廢話,直接代碼 private Stack<Action> actionStack = new Stack<Action>(); private void SetCellValues() { var worksheet = Globals.ThisAddIn.Application.ActiveS ...
  • 大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是不同J-Link版本對於i.MXRT1170連接複位後處理行為。 痞子衡之前寫過一篇舊文 《i.MXRT1170上用J-Link連接複位後PC總是停在0x223104的原因》,這篇文章詳細解釋了 RT1170 BootROM 代碼里軟體 ...
  • 目錄題目思路代碼展示進程A進程B結果展示 題目 要求進程A創建一條消息隊列之後向進程B發送SIGUSR1信號,進程B收到該信號之後打開消息隊列並寫入一段信息作為消息寫入到消息隊列中,要求進程B在寫入消息之後,發SIGUSR2信號給進程A,進程A收到該信號則從消息隊列中讀取消息並輸出消息正文的內容。 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...