我有一個要求,要刪除X天以前名爲「歸檔」的目錄中的所有文件。有多個名爲「archive」的目錄位於目錄樹的不同深度。查找名爲「歸檔」和刪除文件的目錄
我的問題是用什麼工具來查找目錄?我的第一個衝動是使用Perl File:Find
模塊,但過去我一直尷尬地找到一個shell腳本來做同樣的事情,我寫了一個多行Perl腳本。
我有一個要求,要刪除X天以前名爲「歸檔」的目錄中的所有文件。有多個名爲「archive」的目錄位於目錄樹的不同深度。查找名爲「歸檔」和刪除文件的目錄
我的問題是用什麼工具來查找目錄?我的第一個衝動是使用Perl File:Find
模塊,但過去我一直尷尬地找到一個shell腳本來做同樣的事情,我寫了一個多行Perl腳本。
也許這會爲你工作:
# 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
不是爲每個對象啓動一個'rm'進程,而是使用'+'終止符來代替'\;'。這將導致將多個參數捆綁到每個實例。您的流程表,您的處理器和您的用戶會很感激您,對於大量的文件,您將看到極大的速度提升。 – JRFerguson
@ikegami我加了缺少的參數。 :-) – Oliver
Oliver,看起來不錯,但似乎在AIX系統上找不到-ipath選項 – clmccomas
我建議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;
}
});
這將在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的?因爲你想確保你刪除了你想刪除的內容,而不是你想保留的內容。如果你正在刪除的東西,最好採取一些額外的步驟,並確保一切都很好。
你看過恰當命名的'find'了嗎? – Hasturkun
當然有,但找不到目錄路徑的通配符。例如/ path/*/archive/*。所以我將不得不聲明樹中每個存檔目錄的完整路徑,接近100並且不斷增長。 – clmccomas