0

missingというファイルを調べてから、 というディレクトリ内を調べたいと思いますflags

にリストされているすべてのファイルは、missing常にflagsディレクトリに表示されます。

flagsディレクトリ内のすべてのファイルを調べて、それらがファイル内にあるかどうかを確認したいと思いmissingます。それらのいずれかがそうでない場合は、ディレクトリからそのファイルを削除しますflags

    @flags=`ls $dir`;
    $flags_size = scalar @flags;

    $file = "/home1/t01jkxj/check_st/missing";
    $filesize = -s $file;

    if ($filesize < $flags_size) {
      ##What to do??##
    }
4

4 に答える 4

1

ファイルの形式を説明することはありませんが、missing1行に1つのファイルが含まれており、ファイルへの完全な絶対パスが示されていると思います。私が間違って推測した場合は、このソリューションを調整する必要があります。

missingこのプログラムは、ファイルをハッシュにロードします。各ハッシュ要素のキーはファイル名で、値は1です。

ディレクトリが開かれflags、パスが各ファイル名に追加されて、の絶対パスが形成され$filenameます。%missingファイル名がハッシュに表示されない場合は、ファイル名が出力されます。実際にファイルを削除するには、そのunlink行のコメントを外す必要があります。

use strict;
use warnings;

my $missing = "/home1/t01jkxj/check_st/missing";

open my $fh, '<', $missing or die qq(Unable to open "$missing" for read: $!);
my %missing;
while (<$fh>) {
  next unless /\S/;
  chomp;
  $missing{$_} = 1;
}

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

opendir my $dh, $dir or die qq(Unable to open directory "$dir": $!);

for my $file (readdir $dh) {
  my $filename = "$dir/$file";
  unless ($missing{$filename}) {
    # unlink $filename;
    print qq(File "$filename" deleted as not found in 'missing' file\n);
  }
}
于 2012-06-28T18:02:35.380 に答える
0

現在Linuxにはありませんが、これはあなたがしなければならないことの一種です。このスクリプトは、ファイルと配列ディレクトリ内のファイルのリストを収集し、2つの違いを見つけます。私はテストしますが、実際にはできません)-=。擬似コードと考えてください!:

use strict;
use warnings;
my $fi;
my $line;
my @to_delete;
my $var;
my @indir;
my @files;
# the difference of @females and @simpsons
@indir = `ls`;

open($fi, "< list.txt");
while ($line = <$fi>) 
{
    chomp($line);
    push @files, $line;
}
@to_delete=grep(!defined $indir{$_}, @files); #gets difference of the two arrays


print "Delete this:\t$_\n" foreach (@to_delete);
于 2012-06-28T15:41:13.617 に答える
0

これは bash コマンドでもできるようです。何かのようなもの:

cd /path/to/flags; ls | grep -vf missing.txt | xargs rm

注: 上記をテストせずに実行しないでください。

perl では、コードを多少冗長にして警告を出すのがおそらく良い考えでしょう。もちろん、自動化されたジョブの警告は削除できます。

use strict;
use warnings;

my $dir = "/path/to/flags";
chdir $dir or die $!;        # change working directory
my @flags = <*>;             # get a list of the files
my $file = "/home1/t01jkxj/check_st/missing";
open my $fh, "<", $file or die $!;
chomp(my @missing = <$fh>);  # get file names and remove newlines
my %missing = map { $_ => 1 } @missing;   # ..and put them in a hash

my @delete;
for my $file (@flags) {      # all files not in the hash go into @delete
    push @delete, $file unless $missing{$file};
}

if (@delete) {   # do not delete without confirmation
    print @delete . " files to delete\n@delete\n---\nDelete them all? ";
    my $reply = <>;
    if ($reply =~ /^y$/) {
        unlink $_ or warn "$_: $!" for @delete;
    }
} else {
    print "No missing files to delete.\n";
}
于 2012-06-28T16:47:18.467 に答える
0

ハッシュをチェックしてください。行方不明からすべてのエントリをハッシュに入れます。次に、flags dir 内のすべてのファイルをループし、ハッシュ内にあるかどうかを確認します。ある場合は問題ありませんが、そうでない場合はファイルを削除します。

my %missings = map { chomp; $_ => 1 } do {
  open my $fh, '<', $missing_file or die "Can't read $missing_file: $!";
  <$fh>
};

opendir my $dh, $dir or die "Can't read from $dir: $!";
while(readdir $dh) {
    unlink $_ unless delete $missings{$_};
}

# I know, you said this can't happen.
if (keys %missings) {
    print "The following are in $missing_file but not in $dir:\n";
    print "    $_\n" for sort keys %missings;
}

警告: 完全にテストされていません。これを Web ブラウザのボックスに直接入力しました。

于 2012-06-28T15:24:06.397 に答える