2013-01-24 43 views
0

我有用於測試的目錄中包含的大量文件集。我需要保留我的應用程序的目錄結構,但是爲了加快測試速度,我們希望精簡這些文件。我想限制一個目錄可以擁有的文件數目。3.我怎樣才能在linux中做到這一點?遞歸刪除除了每個目錄中的某個數字以外的所有文件

爲了澄清我想完成,解決在Python什麼:

import sys, os 
for root, dirs, files in os.walk(sys.argv[1]): 
    for index, file in enumerate(files): 
     if index > int(sys.argv[2]) - 1: os.remove(os.path.join(root, file)) 

用法:

python thinout.py /path/to/thin\ out/ <maximum_number_of_files_per_directory> 

例子:

python thinout.py testing\ data 3 

我發現a smiliar question about doing this for one directory, but not recursively

回答

2

我會做這樣的事情在bash:

for dir in `find . -type d`; pushd $dir; rm `ls | awk 'NR>3'`; popd; done; 

或者這個版本可能會更好:

for dir in `find . -type d`; pushd $dir; rm `find . -maxdepth 1 -type f | tail -n +3`; popd; done; 

當然 - 只是隨機刪除所有,但第3個文件的目錄總是有點冒險。買方當心...

順便說一句,我沒有測試這個我自己。只是輸入想到的內容。您可能需要稍微調整一下才能使其正常工作。買家要小心。

+0

第一個分號後不需要「做」嗎? – EJK

+0

是的,修正。謝謝。 – Matt

+0

正如@Perleone暗示的,這個版本不適用於需要轉義的目錄名稱(例如,帶有嵌入空格的名稱)。 – mklement0

0

這段相當長的序列將與包含空格等文件一起使用,並且只將前三個按字母排序的文件留在每個子目錄中。

編輯:應用mklement的改進,以應付需要轉義的目錄。

find /var/testfiles/ -type d -print0 | while IFS= read -r -d '' subdir; \ 
do cd "$subdir"; find . -mindepth 1 -maxdepth 1 -type f -print0 | \ 
sort --zero-terminated | tr '\0' '\n' | tail -n+4 | tr '\n' '\0' | \ 
xargs --null --no-run-if-empty rm ; cd "$OLDPWD" ; done 

由於我的尾巴的版本不支持行結束一個--zero--null標誌,我必須解決與tr。歡迎提出改進建議。

+0

你的目錄循環不能用於需要轉義的目錄名稱。使用類似'find/var/testfiles/-type d -print0 |的東西而IFS =讀取-r -d''子目錄;做光盤「$ subdir」; ...';見http://mywiki.wooledge.org/BashFAQ/001 – mklement0

+0

@mklement我無法得到命令與您的修改運行。您是否可以編輯或發佈您的版本作爲個人答案? – Bengt

+0

@Perlene您的回答對我無效。原因似乎是路徑上的空白。 – Bengt

相關問題