0

I have a requirement to delete all files in directories named "archive" older than X days. There are multiple directories named "archive" located in various depths of the directory tree.

My question is what tool to use to find the directories? My first impulse is to use the Perl File:Find module, but I have been embarrassed in the past finding out a shell script one-liner to do the same thing that I have written a multi-line Perl script for.

4

3 に答える 3

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 {} \;

おそらく、見つかったファイルをテキストファイルに書き込んでシナリオ全体をテストし、それが正しいことを確認する必要があります。

find /path/to/your/files* -ipath '*/archive/*' -type f -mtime +10 > filelist.txt
于 2012-06-05T15:28:34.880 に答える
0

Path::Classモジュールをお勧めします。このモジュールは、動作traverse方法に似ていますFile::Findが、より便利です。

このプログラムは、指定されたディレクトリ ツリーを検索し、指定されたフォルダ内にarchiveあり、変更時刻が 3 日以上前のすべてのファイルを見つけます。

現状では、プログラムは基準に一致するファイルを単に印刷します。#それらを実際に削除するには、 を含む行からコメント区切り文字を削除する必要があります$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;
  }
});
于 2012-06-05T16:04:58.103 に答える
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

なぜこのリガマロールをすべて経験するのですか?保持したいものではなく、削除したいものを削除していることを確認したいからです。何かを削除する場合は、いくつかの追加手順を実行して、すべてが問題ないことを確認してください。

于 2012-06-05T17:36:00.290 に答える