2016-04-20 7 views
4

Ich möchte in der Lage sein, eine Liste von Dateien, die einem bestimmten Muster entsprechen. Ich kann Unix bekommen, um diese Dateien mit ls und egrep mit einem regulären Ausdruck aufzulisten, aber ich finde keine Möglichkeit, dies in einen iterativen Prozess umzuwandeln. Ich vermute, dass die Verwendung von LS nicht die Antwort ist. Jede Hilfe würde dankbar erhalten werden.wie Dateien durchlaufen, die einen regulären Ausdruck in einem UNIX-Shell-Skript entsprechen

Mein aktueller ls Befehl sieht wie folgt aus:

ls | egrep -i 'MYFILE[0-9][0-9]([0][1-9]|1[0-2])([0][1-9]|[12][0-9]|[3][01]).dat' 

Ich würde die oben erwarten zum Spiel:

  • MYFILE160418.dat
  • myFILE170312.DAT
  • MyFiLe160416.DaT

aber nicht:

  • MYOTHERFILE150202.DAT
  • myfile.dat
  • myfile.csv

Danke,

Paul.

+0

Hallo @ paul-frith , sollten Sie mit einem 'while' oder einem' for' beginnen. Verwenden Sie einen Zähler wie im Beispiel -> http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-7.html –

+0

In vielen Fällen benötigen Sie keine explizite Schleife, da Sie die Argumente übergeben können ein anderes Programm via Pipe, eventuell mit 'xargs'. –

+0

Brilliant danke - Ich hatte nicht realisiert, dass Sie ls in einer for-Schleife verwenden können. –

Antwort

4

Sie können (GNU) find mit der Regex-Suchoption anstelle von ls verwenden.

find . -regextype "egrep" \ 
     -iregex '.*/MYFILE[0-9][0-9]([0][1-9]|1[0-2])([0][1-9]|[12][0-9]|[3][01]).dat' \ 
     -exec [[whatever you want to do]] {} \; 

Wo [[whatever you want to do]] ist der Befehl, den Sie auf den Namen der Dateien ausführen möchten.

Aus der Manpage

-regextype type 
      Changes the regular expression syntax understood by -regex and -iregex tests 
      which occur later on the command line. Currently-implemented types are 
      emacs (this is the default),posix-awk, posix-basic, posix-egrep and 
      posix-extended. 

    -regex pattern 
      File name matches regular expression pattern. This is a match on the whole 
      path, not a search. For example, to match a file named `./fubar3', you can 
      use the regular expression 
      `.*bar.' or `.*b.*3', but not `f.*r3'. The regular expressions understood by 
      find are by default Emacs Regular Expressions, but this can be changed with 
      the -regextype option. 

    -iregex pattern 
      Like -regex, but the match is case insensitive. 
+1

Interessant - Lustig genug "finden" war das, was ich an erster Stelle sah, aber ich konnte meine Regex nicht zur Arbeit bringen. -regextype "egrep" ist was ich brauchte! –

0

Basierend auf dem Link Andy K vorgesehen habe ich folgende Schleife verwendet, basierend auf meinen Kriterien:

for i in $(ls | egrep -i 'MYFILE[0-9][0-9]([0][1-9]|1[0-2])([0][1-9]|[12][0-9]|[3][01]).dat'); do    
echo item: $i;   
done 
+0

[Parsing 'ls' kann schiefgehen.] (Http://mywiki.wooledge.org/ParsingLs) –

+0

Ich habe mir das angeschaut und es scheint, dass das Parsen von ls eine schlechte Idee ist, weil UNIX fast jeden Charakter in einem erlaubt Dateiname, einschließlich Newline-Feeds etc. Aber da ich Regex-Matching bin, wird dieses Problem sicherlich in diesem Fall gemildert. Gibt es andere Gründe, ein ls nicht zu analysieren? –

+0

Verwenden Sie keine 'ls' Ausgabe für irgendetwas. 'ls' ist ein Tool zum interaktiven Betrachten von Verzeichnismetadaten. Alle Versuche, die 'ls'-Ausgabe mit Code zu analysieren, sind fehlerhaft.Globs sind viel einfacher UND korrekt: 'für Datei in * .txt'. Lesen [Parsing ls] (http://mywiki.wooledge.org/ParsingLs) –

Verwandte Themen