Frage

Ich versuche, als auch Unterverzeichnisse einen String (reference_) mit den Namen aller * .bmp-Dateien in allen Verzeichnissen Präfix. Das erste Mal, wenn wir das Seide Skript ausführen, wird es Verzeichnisse und Unterverzeichnisse erstellen, und unter jedem Unterverzeichnis wird es speichert jede Sceenshot mobile Anwendung mit .bmp Erweiterung.

Als ich die automatisierte silkscript für zweites Mal ausführen wird es wieder schafft die * .bmp-Dateien in allen Unterverzeichnissen. Bevor Sie das Skript für zweites Mal will ich alle * .bmp mit einem String reference_ Präfix.

Zum Beispiel first_screen.bmp reference_first_screen.bmp, Ich habe die Verzeichnisstruktur wie folgt:

C:\Image_Repository\BG_Images\second
...
C:\Image_Repository\BG_Images\sixth

mit first_screen.bmp und first_screen.bmp Dateien etc ...

Könnte jemand mir helfen?

Wie kann ich alle Bilddateinamen mit reference_ String Präfix?

Als ich das Drehbuch für zweites Mal ausführen, nimmt der Perl-Skript in Seide sowohl die Bilder aus dem Unterverzeichnis und vergleicht ihnen beiden Pixel für Pixel. Ich versuche, unten mit Code. Könnten Sie mich bitte leiten wie kann ich diese Aufgabe abzuschließen gehen.

#!/usr/bin/perl -w
&one;

&two;

sub one {

    use Cwd;

    my $dir ="C:\\Image_Repository";
    #print "$dir\n";
    opendir(DIR,"+<$dir") or "die $!\n";
    my @dir = readdir DIR;
    #$lines=@dir;
    delete $dir[-1];
    print "$lines\n";
    foreach my $item (@dir)
    {
        print "$item\n";
    }
    closedir DIR;
}

sub two {

    use Cwd;

    my $dir1 ="C:\\Image_Repository\\BG_Images";
    #print "$dir1\n";
    opendir(D,"+<$dir1") or "die $!\n";
    my @dire = readdir D;
    #$lines=@dire;
    delete $dire[-1];
    #print "$lines\n";
    foreach my $item (@dire)
    {
        #print "$item\n";
        $dir2="C:\\Image_Repository\\BG_Images\\$item";
        print $dir2;
        opendir(D1,"+<$dir2") or die " $!\n";
        my @files=readdir D1;
        #print "@files\n";  
        foreach $one (@files)
        {
            $one="reference_".$one;
            print "$one\n";
            #rename $one,Reference_.$one;
        }
    }
    closedir DIR;
}

Ich habe versucht, offenen Aufruf mit ‚+ <‘ Modus, aber ich bin immer Kompilierungsfehler für die Lese- und Schreibmodus. Wenn ich diesen Code leite, zeigt es die Dateien in BG_images Ordnern mit vorangestelltem String aber eigentlich ist es nicht die Dateien in den Unterverzeichnissen zu aktualisieren.

War es hilfreich?

Lösung

Sie nicht öffnen Sie ein Verzeichnis für das Schreiben. Verwenden Sie einfach opendir ohne den Modus Teile der Zeichenfolge:

opendir my($dir), $dirname or die "Could not open $dirname: $!";

Sie jedoch nicht, dass müssen. Sie können Datei verwenden :: Finden Sie die Liste der Dateien zu machen, die Sie benötigen.

#!/usr/bin/perl
use strict;
use warnings;

use File::Basename;
use File::Find;
use File::Find::Closures qw(find_regular_files);
use File::Spec::Functions qw(catfile);


my( $wanted, $reporter ) = find_regular_files;
find( $wanted, $ARGV[0] );


my $prefix = 'recursive_';


foreach my $file ( $reporter->() )
    {
    my $basename = basename( $file );

    if( index( $basename, $prefix ) == 0 )
        {
        print STDERR "$file already has '$prefix'! Skipping.\n";
        next;
        }

    my $new_path = catfile( 
        dirname(  $file ), 
        "recursive_$basename"
        );

    unless( rename $file, $new_path )
        {
        print STDERR "Could not rename $file: $!\n";
        next;
        }

    print $file, "\n";  
    }

Andere Tipps

Sie sollten wahrscheinlich die Datei überprüfen :: Modul für diese Suche - es macht Rekursion steigen und fallen im Verzeichnisbaum einfacher.

Sie sollten wahrscheinlich die Dateinamen werden gescannt und diejenigen ändern, die mit reference_ nicht starten, so dass sie es tun. Das kann den Dateinamen nach oben in einen Verzeichnisnamen und Dateinamen erfordert Aufspalten und dann den Dateinamen Teil mit reference_ prefixing. Das ist getan mit dem File :: Basename Modul.

Zu einem bestimmten Zeitpunkt müssen Sie entscheiden, was passiert, wenn Sie das Skript zum dritten Mal ausgeführt werden. Sind die Dateien, die bereits mit reference_ starten bekommen überschrieben, oder tun die ohne Präfix-Dateien erhalten überschrieben, oder was?

Der Grund, die Dateien werden nicht umbenannt werden, dass der Umbenennungsvorgang kommentiert geführt wird. Denken Sie daran, use strict; am Anfang des Skripts hinzuzufügen (sowie die -w Option, die Sie verwendet haben).

Wenn Sie eine Liste von Dateien in einem Array @files bekommen (und die Namen sind Basisnamen, so dass Sie müssen nicht Geige mit File :: Basename), dann könnte die Schleife wie folgt aussehen:

   foreach my $one (@files)
   {
        my $new = "reference_$one";
        print "$one --> $new\n";
        rename $one, $new or die "failed to rename $one to $new ($!)";
   }

Mit Hilfe von find Dienstprogramm von coreutils für Windows :

$ find -iname "*.bmp" | perl -wlne"chomp; ($prefix, $basename) = split(m~\/([^/]+)$~, $_); rename($_, join(q(/), ($prefix, q(reference_).$basename))) or warn qq(failed to rename '$_': $!)"
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top