2017-05-19 5 views
0

nehmen wir an, ich einen Ordner mit einigen XML-Datei haben:Unix finden und sortieren mit Wildcards

  • a-as-jdbc.xml
  • z-as-jdbc.xml
  • fa-jdbc .xml
  • config.xml
  • router.xml
  • paster.xml
  • cleardown.xml

Ich möchte die Suche mit einer Art von Sortierbefehl mit Wildcards und meine benutzerdefinierte Sortierlogik leiten.

Das, weil ich möchte, dass die Reihenfolge des Dateinamens immer gleich ist.

Zum Beispiel möchte ich immer:

  • 1 Element: "config.xml"
  • 2 Element: "* .as-jdbc.xml"
  • 3 Element: "-jdbc XML“(ohne Muster " .as-Jdbc")
  • 4 Element: "router.xml"
  • und so weiter ...

Wie kann ich das erreichen? Irgendeine Idee? Ich habe es in der Vergangenheit Arrays verwenden, aber nicht genau erinnern, wie ich jetzt tat ...

Dank

+0

Ich sehe nicht eindeutig das Muster, das Sie wollen, könnten Sie es versuchen um das zu klären? –

+0

Das folgende Muster ist genau die Reihenfolge, die ich im Beispiel angegeben habe, ich möchte die LS-Ausgabe immer so sortiert: zuerst die config.xml dann "* .as-jdbc.xml" dann "-jdbc.xml" (ohne Muster ".as-jdbc") und so weiter ... – ivoruJavaBoy

+0

Und was ist mit Paster und Cleardown? –

Antwort

3

Nicht zu hübsch, aber:

rules.txt:

config\.xml 
.*\.as\-jdbc\.xml 
^[^-]*\-jdbc\.xml 
router\.xml 

Befehle:

$ find /path/to/dir > /tmp/result.txt 
$ cat rules.txt | xargs -I{} grep -E "{}" /tmp/result.txt 
config.xml 
a-as-jdbc.xml 
z-as-jdbc.xml 
fa-jdbc.xml 
router.xml 

Sie werden die beiden anderen Mustern, die fürmuss hinzufügenund cleardown

+0

Vielen Dank alle Jungs, alle Antworten sehen gut aus und hilfreich, aber diese erlauben mir, die Reihenfolge zu ändern, ohne das Skript zu ändern ... ich werde es testen! :) – ivoruJavaBoy

1

Es ist sicherlich einfacher, dies in einer höheren Sprache wie Python zu tun.

Dies ist kein Sortierproblem; es ist ein Bestellproblem. Daher können Sie den Unix-Sortierbefehl nicht verwenden.

Zwangsläufig müssen Sie 4 Pässe sowieso machen, damit ich entweder tun würde:

$ find /tmp/alex -name config.xml ; \ 
> find /tmp/alex -name *-as-jdbc.xml ; \ 
> find /tmp/alex \(\! -name *-as-jdbc.xml -a -name *-jdbc.xml \) ; \ 
> find /tmp/alex \(-type f -a \! -name config.xml -a \! -name *-jdbc.xml \) 
/tmp/alex/config.xml 
/tmp/alex/a-as-jdbc.xml 
/tmp/alex/z-as-jdbc.xml 
/tmp/alex/fa-jdbc.xml 
/tmp/alex/cleardown.xml 
/tmp/alex/paster.xml 
/tmp/alex/router.xml 

Oder nutzen grep:

$ find /tmp/alex -type f > /tmp/aaa 
$ grep /config.xml /tmp/aaa ; \ 
> grep -- -as-jdbc.xml /tmp/aaa ; \ 
> grep -- -jdbc.xml /tmp/aaa | grep -v -- -as-jdbc.xml ; \ 
> egrep -v '(?:config.xml|-jdbc.xml)' /tmp/aaa 
/tmp/alex/config.xml 
/tmp/alex/a-as-jdbc.xml 
/tmp/alex/z-as-jdbc.xml 
/tmp/alex/fa-jdbc.xml 
/tmp/alex/cleardown.xml 
/tmp/alex/paster.xml 
/tmp/alex/router.xml 
0

Ich empfehle Ihre nur darum Befehle in der Reihenfolge finden Sie wollen:

$ find . -name config.xml; \ 
> find . -name \*.as-jdbc.xm; \ 
> find . -name \*-jdbc.xml -a ! -name \*as-jdbc.xml; \ 
> find . -name router.xml; \ 
> ... and so on.