Script für Dateisuche und Ausgabe. Hat jemand eine Idee?

Corin Corvus

Lieutenant
Registriert
Dez. 2010
Beiträge
827
Hallo,

ich möchte einen bestimmten Inhalt (z.b. Datum) in Dateien suchen, die einen bestimmten Namen, aber eine andere endung haben. Dies mache ich mit showspl DATEINAME.* | grep -l 20150501

Wenn er die Datei gefunden hat, soll er mir den Dateinamen dieser Datei komplett ausgeben mit Endung.

Jemand eine Idee, wie ich das bewerkstelligen kann?

Das ganze soll in einem Script laufen und die Datei, in dem dieser Wert gefunden wurde, soll im Anschluss auf einen anderen PC kopiert werden.

Gruß
 
Ich kenne showspl nicht, aber grep -l ergibt nur Sinn, wenn es auf Dateien angewendet wird, nicht um Eingabe direkt hineinzupipen (dann kommt als Ausgabe bestenfalls "Standard input"). Angenommen, showspl liefert dir eine Liste von Dateinamen, kannst du das aber mit xargs bewerkstelligen: "(Befehl, der Liste von Dateinamen ausgibt) | xargs grep -l (Suchmuster)".
 
NullPointer schrieb:
Ich kenne showspl nicht, aber grep -l ergibt nur Sinn, wenn es auf Dateien angewendet wird, nicht um Eingabe direkt hineinzupipen (dann kommt als Ausgabe bestenfalls "Standard input"). Angenommen, showspl liefert dir eine Liste von Dateinamen, kannst du das aber mit xargs bewerkstelligen: "(Befehl, der Liste von Dateinamen ausgibt) | xargs grep -l (Suchmuster)".

Showspl erlaubt das suchen von werten innerhalb von Dateien. Wenn du z.b. showspl logfile.txt | grep -l "datum" angibst, gibt er dir die Inhalte aus, die mit diesem Wert gefunden wurden. Dateinamen gibt er hingegen nicht raus
 
Dann haben wir verschiedene Versionen von grep - bei mir sagt die Manpage zu -l (klein L, nicht groß I):

-l, --files-with-matches
Suppress normal output; instead print the name of each input file from which output would normally
have been printed. The scanning will stop on the first match. (-l is specified by POSIX.)

Das heißt, es wählt aus einer Liste von Dateinamen die Namen derjenigen Dateien aus, die das Suchmuster enthalten.
 
Corin Corvus schrieb:
Jemand eine Idee, wie ich das bewerkstelligen kann?
Ja, das ganze als Perl-Skript machen und die Übersicht behalten:

Code:
use strict;
use warnings;
use File::Copy;
use File::Slurp;
use File::Glob ':globally';

my ($fn)   = @ARGV;
my $muster = '20150501';
my $ziel   = '/tmp';
my @files  = <"$fn.*">;

for my $fn (@files) {
   my $content = read_file($fn ) ;
   if ($content =~ /$muster/g) {
      print "$fn\n";
      copy("$fn", "$ziel/$fn") or die "Kopierfehler: $!";
   }
}

$> perl meinskript.pl DATEINAME

Dann werden alle Dateien DATEINAME.* untersucht (glob).
 
Dafür Perl zu bemühen, halte ich für Overkill. Mit einer Kombination aus find und grep lässt sich das super in der Shell lösen.
 
NullPointer schrieb:
Dafür Perl zu bemühen, halte ich für Overkill. Mit einer Kombination aus find und grep lässt sich das super in der Shell lösen.

Finde ich nicht, da Perl mit
  • File::Glob (abc.* auflösen und in eine Liste packen)
  • File::Slurp (die Datei durchsuchbar in einem Skalar zur Verfügung stellen)
  • File::Copy (Kopieroperationen im Dateisystem einfach durchführen)
alle hier benötigten Operationen ohne weiteres bereitstellt. Man muss diese nur in der richtigen Reihenfolge hintereinandersetzen und kann die Aufgabenstellung leicht um beliebige zusätzliche Aufgaben erweitern. Jedenfalls würde man mit Perl sehr wenig Zeit brauchen, um die Aufgabe zu lösen.

Sicher geht das auch in der #bash mit den Unix-Bordmitteln. Werde ich gleich mal probieren ...
 
Hey. das Perl sieht schon super aus. Leider habe ich extern nur Putty zugriff. Daher nur Bash. Danke schon mal für die Hilfe
 
Corin Corvus schrieb:
Leider habe ich extern nur Putty zugriff. Daher nur Bash. Danke schon mal für die Hilfe

Perl ist auf allen Linuxen die ich kenne schon drauf, hmmm ...
 
find $QUELLORDNER -type f | xargs grep -l $MUSTER | xargs -i cp {} $ZIELORDNER

Den find-Befehl kann man auch noch beliebig feiner konfigurieren, z. B. mit -maxdepth 1, um die rekursive Suche zu deaktivieren.
 
Zurück
Oben