2013-03-04 59 views
2

最近,我正在編寫一個用於維護特定文件夾大小的bash命令行腳本。請注意,有些程序有時會在此文件夾內寫入/更新文件,因此「全部捕獲」rm -rf將永遠不適合這種情況。刪除lsof在文件夾中未列出的所有文件

我能夠檢索所有的「活動」,換句話說,打開的文件使用lsof的,並把它們打印出來使用awk:

lsof +D ./ | awk ' { print ($NF) } ' 

這給了我這些打開的文件列表,我明明DON 'T想擺脫他們。不過,我想刪除其餘的。

我希望有在rm命令的選項排除使用^選擇一些文件...

有沒有辦法在bash實現這一目標?

非常感謝。

+0

爲什麼你不想刪除打開的文件?它們不會對打開句柄的程序造成任何問題(它們將能夠讀取和/或寫入,就好像它們仍然存在一樣),並且這些空間將在關閉它們時自動回收。 – Cairnarvon 2013-03-04 22:53:06

+0

@Cairnarvon因爲這些文件是用於記錄/追蹤的目的,並且按照業務規則,我們應該保持它們完好無損。 – 2013-03-04 22:54:22

+1

您應該清楚地將這些文件列入白名單,而不是希望在清理文件夾時沒有意外關閉您的進程。 – Cairnarvon 2013-03-04 23:44:34

回答

1

首先確保你有extglob

shopt -s extglob 

接着刪除lsof未列出的所有文件:打破上述情況,我們要加入的lsof與管道結果

DONT_RM=`lsof +D \. | awk '{ print $NF; }' | tr "\\n" "|" | sed 's/\.\///g'` && rm !($DONT_RM) 

|而不是換行符\n,並從文件名的開頭刪除前面的./。然後我們將這個OR列表傳遞給rm,作爲不是! extglob選項。試試看,它在我的基本測試中起作用。

+0

真的很好的工作在一線!非常感謝,在演示中選擇了一些有用的技巧。 – 2013-03-05 02:25:54

4

這可以在沒有臨時文件一行來完成,但我會分裂它做出註釋和調試更加容易:

# Get a sorted list of used files 
lsof +D ./ | awk ' { print ($NF) } ' | sort | uniq > usedFiles 

# Get a sorted list of existing files 
find ./ | sort > existingFiles 

# Find lines unique to existingFiles 
comm -23 existingFiles usedFiles > removableFiles 

# Delete them 
rm $(< removableFiles) 

請注意,這不是空白的安全。

+0

emmm我也用bash腳本的方式制定出來了。我正在使用for循環並測試此目錄中的每個文件,如果它未打開,請將其刪除。 – 2013-03-04 23:39:01

相關問題