2012-06-05 48 views
0

我有一個要求,要刪除X天以前名爲「歸檔」的目錄中的所有文件。有多個名爲「archive」的目錄位於目錄樹的不同深度。查找名爲「歸檔」和刪除文件的目錄

我的問題是用什麼工具來查找目錄?我的第一個衝動是使用Perl File:Find模塊,但過去我一直尷尬地找到一個shell腳本來做同樣的事情,我寫了一個多行Perl腳本。

+0

你看過恰當命名的'find'了嗎? – Hasturkun

+0

當然有,但找不到目錄路徑的通配符。例如/ path/*/archive/*。所以我將不得不聲明樹中每個存檔目錄的完整路徑,接近100並且不斷增長。 – clmccomas

回答

3

也許這會爲你工作:

# Delete one at a time. 
find /path/to/your/files* -type f -mtime +10 -exec rm {} \; 

# Use one rm for multiple dirs. (GNU find) 
find /path/to/your/files* -type f -mtime +10 -exec rm {} + 

# Use one rm for multiple dirs. (Any find) 
find /path/to/your/files* -type f -mtime +10 -print0 | xargs -0 rm 

在這種情況下,它會刪除你的路徑中的所有文件,是超過10天。小心使用它。 :-)

如果你只是想在文件夾歸檔刪除文件,你應該添加

-ipath '*/archive/*' 

find /path/to/your/files* -ipath '*/archive/*' -type f -mtime +10 -exec rm {} \; 

也許你應該測試整個場景中找到的文件寫入到一個textfile只是爲了確保它是正確的。

find /path/to/your/files* -ipath '*/archive/*' -type f -mtime +10 > filelist.txt 
+2

不是爲每個對象啓動一個'rm'進程,而是使用'+'終止符來代替'\;'。這將導致將多個參數捆綁到每個實例。您的流程表,您的處理器和您的用戶會很感激您,對於大量的文件,您將看到極大的速度提升。 – JRFerguson

+0

@ikegami我加了缺少的參數。 :-) – Oliver

+0

Oliver,看起來不錯,但似乎在AIX系統上找不到-ipath選項 – clmccomas

0

我建議Path::Class模塊,其中有一個traverse方法類似的方式File::Find作品,但有很多更多的便利。

該程序將搜索給定的目錄樹並查找名爲archive的文件夾中的所有文件,修改時間爲三天或更久以前。

按照規定,程序將只打印找到的符合條件的文件。要實際刪除它們,您應該從包含$node->remove的行中刪除#評論分隔符。

use strict; 
use warnings; 

use Path::Class; 

my $dir = dir '/path/to/root'; 

$dir->traverse(sub { 
    my ($node, $cont) = @_; 
    if ($node->is_dir) { 
    $cont->(); 
    } 
    elsif ($node->dir->basename eq 'archive') { 
    my $age = (time - $node->stat->mtime)/(60 * 60 * 24); 
    printf "%s %.1f days old\n", $node, $age; 
    # $node->remove if $age > 3; 
    } 
}); 
0

這將在Linux和Mac電腦:

$ find . -name archive -type d -mtime -$X_DAYS -delete 

然而,我更傾向於將先運行此:

$ find . -name archive -type d -mtime -$X_DAYS -ls | tee find.out 

,將列出你想的文件刪除並將它們放在一個名爲find.out的文件中。您可以查看輸出並確保沒有任何內容會導致任何問題。也許有一個存檔目錄超過10天,但你不想刪除它。

您可以編輯此文件以刪除任何要保留的內容。然後您可以運行以下命令:

$ awk '{print "rm -rf " $NF}' find.out | tee command.out 

這將創建一個命令文件來刪除目錄。看看command.out,如果一切正常,那麼這樣做:

$ SH command.out

爲什麼要經歷這些rigamarole的?因爲你想確保你刪除了你想刪除的內容,而不是你想保留的內容。如果你正在刪除的東西,最好採取一些額外的步驟,並確保一切都很好。