2016-09-30 1 views
1

Ich muss alle Dateien in einem Verzeichnis zu einer Datei verketten, aber Dateien mit angegebenen Namen müssen oben auf der Ausgabe sein. Nur cat * > result wird alle Dateien in alphabetischer Reihenfolge verketten. Gibt es eine Möglichkeit, Katze zu sagen, um die Datei vars.css oder eine andere am Anfang der Ausgabe zu platzieren? Für jetzt habe ich nur Dateien umbenannt müssen zuerst 000-filename sein, aber ich frage mich, ob es bessere Lösung ohne Umbenennen von Dateien gibt.Cat * und Reihenfolge der Dateien

Antwort

3

Es gibt viele Wege, dies zu erreichen, von denen die meisten ein anderes Programm aufrufen würden, um die Liste der Dateien zu erzeugen (in der bevorzugten Reihenfolge).

Eine Möglichkeit, es mit nur bash (und unter der Annahme einer geringen Anzahl von Dateien, die Sie manuell nach vorne verschieben möchten) zu erreichen wäre:

auf die

(GLOBIGNORE=vars.css && cat vars.css *)

Wenn Sie mehrere Dateien zu bringen

(GLOBIGNORE=vars.css:other.file && cat vars.css other.file *)

die variable bash-Dateien, die Muster passend zu ignorieren sagt GLOBIGNORE Umgebung, während ein glo erweitert: vor der Liste können sie in GLOBIGNORE aufgenommen werden b (wie *). Weitere Informationen finden Sie unter bash manual.

Es ist wichtig sicherzustellen, dass GLOBIGNORE nicht versehentlich für den Rest der Shell gesetzt ist (Danke an Tim, dass er darauf hinweist). Sie können das auf verschiedene Arten erreichen, wie ich es oben getan habe, indem Sie die ganze Aussage in Klammern setzen. Wenn Sie es ohne Klammern ausführen, sollten Sie sicherstellen, dass Sie danach GLOBIGNORE nicht gesetzt haben: unset GLOBIGNORE

+0

Verwenden Sie '&&' andernfalls wird die 'GLOBIGNORE' Variable global (in dieser Shell) statt nur für diesen Befehl gesetzt. – Tim

+0

Danke, 'GLOBIGNORE' hat perfekt funktioniert. – VictorPrudniy

+0

Keine Notwendigkeit für Klammern, verwenden Sie einfach: 'GLOBIGNORE = vars.css cat vars.css *' oder 'GLOBIGNORE = vars.css: other.file cat vars.css other.file *' – Tim

2

Sie müssen explizit sein, aber erweiterte Muster machen das ein wenig einfacher, wenn die Datei zuerst kommen soll.

shopt -s extglob 
cat vars.css !(vars.css) > result 

!(vars.css) ist wie *, aber passt alles außervars.css.

Andernfalls definieren Sie ein benutzerdefiniertes Gebietsschema, in dem vars.css an der gewünschten Position relativ zu den anderen Dateien sortiert wird. Es ist wirklich nicht etwas, für das einfaches Globbing geeignet ist.

+0

Es gibt weitere Informationen über erweitertes Globbing in der [Bash man page] (https://www.gnu.org/software/bash/manual) /html_node/Pattern-Matching.html). Es gibt auch einen [Linux Journal Artikel] (http://www.linuxjournal.com/content/bash-extended-globbing) darüber. – Tim

+0

Danke, diese Lösung scheint ein richtiger Weg zu sein, dies zu lösen. – VictorPrudniy

Verwandte Themen