[20200414]Linux下快速刪除大量檔案(補充).txt
[20200414]Linux下快速刪除大量檔案(補充).txt
--//昨天看了連結下面刪除大量檔案的效率.
--//第一感覺這篇文章的內容我在那裡看過,我找了原始連結:
--//原始連結沒有Python方式,記錄一下:
import os
import timeit
def main():
for pathname,dirnames,filenames in os.walk('/home/username/test'):
for filename in filenames:
file=os.path.join(pathname,filename)
os.remove(file)
if __name__=='__main__':
t=timeit.Timer('main()','from __main__ import main')
print t.timeit(1)
1.建立測試檔案樣本:
$ mkdir testtest
$ cd testtest
$ time for i in $(seq 1 500000); do echo testing > $i.txt; done
real 0m42.289s
user 0m6.409s
sys 0m16.296s
--//再次說明,刪除操作測試要小心,小心刪除重要檔案!!
2.你可以發現perl的指令碼實際上如下:
$ time perl -e 'unlink for ( <*> )'
$ time perl -e 'for(<*>){((stat)[9]<(unlink))}'
real 0m30.646s
user 0m1.365s
sys 0m8.623s
--//我測試環境。你可以發現perl實際上呼叫unlink。我發現unlink實際上是也是linux的一個命令。
$ man unlink
UNLINK(1) User Commands UNLINK(1)
NAME
unlink - call the unlink function to remove the specified file
SYNOPSIS
unlink FILE
unlink OPTION
--//你可以發現它支援的引數幾乎沒有,很純粹的就是一個刪除操作。它的缺點是隻能1個1個刪除。
$ time ls -1 | xargs -IQ -P20 -r unlink Q
real 0m58.953s
user 0m6.860s
sys 0m49.183s
--//因為1個1個刪除,你可以發現執行時間並不是很快,大約需要1分鐘。而且我還開啟了並行。
--//如果不開平行,幾乎需要20分鐘完成。
3.修改如下:
$ time ls -1 | xargs -P20 -r rm
real 0m30.573s
user 0m2.007s
sys 0m34.392s
--//幾乎接近perl的執行效率,但是sys消耗很大。也就是利用平行執行,可以提高執行效率。
4.另外如果你使用find你可以發現執行效率並不是很高:
--//貼出我的測試結果。
$ time find . -name "*.txt" -print0 | xargs -P 20 -0 -r rm
real 2m14.205s
user 0m0.659s
sys 0m40.367s
$ time find ./ -delete
find: cannot delete ./: Invalid argument
real 2m37.203s
user 0m0.295s
sys 0m13.091s
$ time find ./ -type f -exec rm {} \+ >/dev/null
real 2m38.328s
user 0m0.471s
sys 0m16.027s
5.分析為什麼選擇find執行更慢:
--//為什麼呢?我開始相當然認為問題出在find的輸出上。
$ find . -name "*.txt" -print | head -3
./326847.txt
./334810.txt
./341612.txt
--//我開始以為問題出在前面帶有./,修改如下:
$ time find . -name "*.txt" -print| sed 's+^./++' | xargs -P 20 -r rm
real 2m19.387s
user 0m1.062s
sys 0m39.686s
--//依舊很慢。
$ time ls -f | xargs -P 20 -r rm
rm: cannot remove `.' or `..'
rm: cannot remove `.' or `..'
real 2m38.970s
user 0m0.842s
sys 0m40.831s
--//我僅僅換成-f 執行時間就變成了2分38秒。再明白不過了,問題出在輸出刪除的順序上。
--//ls -f順序是亂的。find也是一樣。
--// -f do not sort, enable -aU, disable -lst 什麼意思不理解。
$ ls -f | head -5
.
..
326847.txt
334810.txt
341612.txt
$ find -name "*.txt" -print | head -5
./326847.txt
./334810.txt
./341612.txt
./432762.txt
./86199.txt
--//幾乎是亂序的。linux到底如何讀目錄結構的,不理解....
$ ls -1 | head -5
100000.txt
100001.txt
100002.txt
100003.txt
100004.txt
100005.txt
$ ls -1 | sort -n | head -5
1.txt
2.txt
3.txt
4.txt
5.txt
--//可以發現ls -1僅僅基本"排序"輸出。
$ time find . -name "*.txt" -print| sed 's+^./++' | sort -n | xargs -P 20 -r rm
real 0m27.326s
user 0m1.508s
sys 0m33.834s
--//27秒。如果排序執行效率更高。
$ time find . -name "*.txt" -print| sort -n | xargs -P 20 -r rm
real 0m33.970s
user 0m2.852s
sys 0m34.469s
--//與find輸出帶./無關,我前面判斷有點武斷了。
$ time ls -1 | sort -n | xargs -P20 -r rm
real 0m36.091s
user 0m2.258s
sys 0m33.839s
總結:
--//從測試看如果刪除順序與建立順序一致,視乎刪除最快。我僅僅補充一點點自己的建議刪除的順序也很重要。
--//從這個例子:time ls -1 | xargs -IQ -P20 -r unlink Q 也可以看出刪除檔案順序對於提高效率也很重要。
--//再次說明學習過程中一些細節很重要。
--//我的檔案系統是ext3,有機會看看檔案系統目錄結構的格式。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2685985/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Linux如何快速刪除大量碎小檔案?Linux
- Linux中RM快速刪除大量檔案/資料夾方法Linux
- 批量刪除大量小檔案
- [20231130]快速刪除大量檔案測試(perl版本)3.txt
- linux下使用rm命令刪除一個有大量檔案的目錄Linux
- Linux下批量刪除空檔案或者刪除指定大小的檔案Linux
- linux 下刪除亂碼檔案Linux
- Linux下刪除昨天的檔案Linux
- linux 下按照時間刪除檔案Linux
- Linux 刪除大量小檔案的兩種方案 | 運維進階Linux運維
- Linux刪除檔案命令Linux
- Linux批量刪除檔案Linux
- windows 下刪除.svn檔案Windows
- Linux下刪除亂碼或特殊字元檔案Linux字元
- Linux下使用lsof恢復刪除的檔案Linux
- linux下刪除指定日期前的檔案Linux
- 利用rsync刪除rm -rf 不能一次性刪除的大量檔案
- 【Linux】linux下刪除/清空資料夾/檔案命令Linux
- 得到txt空白行的行數、將txt檔案的空行刪除和刪除csv檔案中指定的行
- 刪除大量檔案Argument list too long錯誤解決
- linux 模糊批量刪除檔案Linux
- 高延時下如何快速傳輸大量檔案
- 利用rsync實現快速刪除海量檔案
- linux下恢復誤刪除的資料檔案Linux
- oracle 快速刪除大批量資料方法(全部刪除,條件刪除,刪除大量重複記錄)Oracle
- linux的刪除檔案命令和強制刪除命令Linux
- [20160407]bbed修改檔案頭2(補充).txt
- oracle 快速刪除大批量資料方法(全部刪除,條件刪除,刪除大量重複記錄) 轉Oracle
- 【轉】oracle 快速刪除大批量資料方法(全部刪除,條件刪除,刪除大量重複記錄)Oracle
- 刪除檔案
- 解決刪除Linux下刪除檔案過多而受shell限制的問題Linux
- 誤刪除$ORACLE_HOME/dbs下的引數檔案、密碼檔案,如何快速重建Oracle密碼
- linux下rm命令刪除檔名中包含特殊字元的檔案Linux字元
- windows下刪除過期的檔案Windows
- linux下恢復誤刪除oracle的資料檔案LinuxOracle
- Linux下用rm刪除的檔案的恢復方法Linux
- linux系統下檔案誤刪除該如何恢復?Linux
- linux下 恢復被rm意外刪除資料檔案Linux