2017-10-16 59 views
0

我有一個存儲庫,我們需要監視並跟蹤其使用情況。
我們有規則定期清除舊文件。
find命令用於識別舊文件
查找/ SRV /關係/關係數據/存儲/ -name「* nupkg」 -mtime 175型的F使用find和du來顯示文件夾大小

上述命令是用於與RM到刪除文件。

讓我們假設find命令的輸出是這樣的:

/srv/nexus/nexus-data/storage/nish-nuget-test/Microsoft.Deployment.WindowsInstaller/1.0.0/Microsoft.Deployment.WindowsInstaller-1.0.0.nupkg 
/srv/nexus/nexus-data/storage/nish-nuget-test/Microsoft.Deployment.WindowsInstaller/1.0.1/Microsoft.Deployment.WindowsInstaller-1.0.1.nupkg 
/srv/nexus/nexus-data/storage/nish-nuget-test/MSBuild.ILMerge.Task/1.0.5/MSBuild.ILMerge.Task-1.0.5.nupkg 
/srv/nexus/nexus-data/storage/nish-nuget-test/Microsoft.Bcl/1.1.10/Microsoft.Bcl-1.1.10.nupkg 
/srv/nexus/nexus-data/storage/nish-nuget-test/NuGet.CommandLine/3.3.0/NuGet.CommandLine-3.3.0.nupkg 
/srv/nexus/nexus-data/storage/nish-nuget-test/NuGet.CommandLine/3.4.3/NuGet.CommandLine-3.4.3.nupkg 
/srv/nexus/nexus-data/storage/nish-nuget- test/NuGet.CommandLine/2.8.5/NuGet.CommandLine-2.8.5.nupkg 
/srv/nexus/nexus-data/storage/nish-nuget-test/NuGet.CommandLine/2.8.3/NuGet.CommandLine-2.8.3.nupkg 
/srv/nexus/nexus-data/storage/rnaibnexus-nuget-releases/Testing.TestNugetNamingConvention.App/2.0.3/Testing.TestNugetNamingConvention.App-2.0.3.nupkg 
/srv/nexus/nexus-data/storage/rnaibnexus-nuget-releases/Testing.TestNugetNamingConvention.App/2.0.0/Testing.TestNugetNamingConvention.App-2.0.0.nupkg 
/srv/nexus/nexus-data/storage/rnaibnexus-nuget-releases/Testing.TestNugetNamingConvention.App/1.2.0/Testing.TestNugetNamingConvention.App-1.2.0.nupkg 
/srv/nexus/nexus-data/storage/rnaibnexus-nuget-releases/Testing.TestNugetNamingConvention.App/1.0.2/Testing.TestNugetNamingConvention.App-1.0.2.nupkg 
/srv/nexus/nexus-data/storage/rnaibnexus-nuget-releases/Testing.TestNugetNamingConvention.App/1.0.0/Testing.TestNugetNamingConvention.App-1.0.0.nupkg 
/srv/nexus/nexus-data/storage/rnaibnexus-nuget-releases/.nexus/attributes/Barclays.TestNugetNamingConvention.App/2.0.3/Testing.TestNugetNamingConvention.App-2.0.3.nupkg 
/srv/nexus/nexus-data/storage/rnaibnexus-nuget-releases/.nexus/attributes/Testing.TestNugetNamingConvention.App/2.0.0/Testing.TestNugetNamingConvention.App-2.0.0.nupkg 
/srv/nexus/nexus-data/storage/rnaibnexus-nuget-releases/.nexus/attributes/Barclays.TestNugetNamingConvention.App/1.2.0/Barclays.TestNugetNamingConvention.App-1.2.0.nupkg 
/srv/nexus/nexus-data/storage/rnaibnexus-nuget-releases/.nexus/attributes/Testing.TestNugetNamingConvention.App/1.0.2/Testing.TestNugetNamingConvention.App-1.0.2.nupkg 
/srv/nexus/nexus-data/storage/nish-testing/.nexus/attributes/.nexus/trash/Akka/1.1.1/Akka-1.1.1.nupkg 
/srv/nexus/nexus-data/storage/nish-testing/.nexus/attributes/Akka/1.1.1/Akka-1.1.1.nupkg 
/srv/nexus/nexus-data/storage/nish-testing/Akka/1.1.1/Akka-1.1.1.nupkg 

我的問題是這樣的,我想顯示磁盤空間的ammount的,我可以在實際搬遷之前保存, 即可以說,上述* .nupkg文件是舊的,需要被刪除,因此用戶應該有一個統計數據爲多少空間將被實際保存

我需要的輸出是這樣的

xxx MB /nish-nuget-test 
yyy GB /rnaibnexus-nuget-releases 
zzz KB /nish-testing 

我只需要一個級別深度@/srv/nexus/nexus-data/storage,以及文件和文件夾的所有款項應遞歸加起來

我能得到的最接近的是這

find /srv/nexus/nexus-data/storage/ -name '*nupkg' -mtime +175 -type f -print0 | xargs --null -I '{}' du -sh '{}' | sort -h 

然而,這只是列舉出來的單個文件,我試圖添加--max-depth = 1,但無法獲得正確的語法。

或者我用,find /srv/nexus/nexus-data/storage/ -name '*nupkg' -mtime +175 -type f -exec du -ch {} + | grep total$ 但這只是列舉出整個文件列表的總和

任何建議請

回答

0

我有兩個步驟的建議。

步驟1,獲得適合您的find並確定您將需要的列。試着用:

cd /srv/nexus-data/storage 
find . -name '*.nupkg' -mtime +175 -type f -exec ls -l {} \; 

我寧願cd到你想要的目錄,並避免所有你不感興趣的子目錄

步驟2。給定輸出,找到包含文件大小的列(在我的例子中是#5)和文件名(在我的例子中是#9)。然後,運行find通過如下:

find . -name '*.nupkg' -mtime +175 -type f -exec ls -l {} \; | awk ' 
{ 
    split($9, a, "/"); 
    sum[a[2]] += $5; 
} 

END { 
    for (i in sum) { 
    print i, sum[i]; 
    } 
} 
' 

如有必要,更改$5$9而對應的大小和文件名,列(awk將計算周圍的白色空間,$1是第一等等)。awk將處理所有文件,將字符拆分爲字符/,以便數組a具有結果,並且a[2]第一個子目錄要合計。END位將輸出累加的和以及它們所屬的子目錄。

awk腳本可能會變成一個班輪,但我把它留在了clariry的展開形式。

編輯:使用@CharlesDuffy很好的建議,並假設你有GNU發現(並與他們換行沒有文件名),你可以使用:

find . -name '*.nupkg' -mtime +175 -type f -printf '%s\t%h\n' | awk ' 
{ 
    split($2, a, "/"); 
    sum[a[2]] += $1; 
} 

END { 
    for (i in sum) { 
    print i, sum[i]; 
    } 
} 
' 

最後,只是爲了完整起見,這可以用換行做太多:

find . -name '*.nupkg' -mtime +175 -type f -printf '%s\t%h\0' | awk ' 
BEGIN { 
    RS="\0"; 
} 

{ 
    split($2, a, "/"); 
    sum[a[2]] += $1; 
} 

END { 
    for (i in sum) { 
    print i, sum[i]; 
    } 
} 
' 
+0

解析的輸出'LS -l' [是不是好的做法](http://mywiki.wooledge.org/ParsingLs)(請參見「獲取元數據上的文件「爲你的直接用例)。如果使用GNU'find',特別是'-printf'可以和一個格式字符串直接打印文件大小一起使用。 –

+1

'找... -printf「%s的\ t%H \ 0'',例如,會以字節爲單位打印尺寸對每個匹配的文件,選項卡,然後將目錄名,然後一個NUL。這使您可以明確地讀取包含換行符的目錄名稱。 –

+0

可我們已經顯示在KB,GB,MB – Shir