2016-09-30 9 views
1

ディレクトリ内のすべてのファイルを1つのファイルに連結する必要がありますが、指定された名前のファイルは出力の最上部にある必要があります。 cat * > resultを実行すると、すべてのファイルがアルファベット順に連結されます。 catにファイルvars.cssまたはその他のファイルを出力の先頭に置くように指示する方法はありますか? 今のところ私はちょうど000-filenameに最初にする必要があるファイルの名前を変更しましたが、ファイルの名前を変更せずにより良い解決策があるのだろうかと思います。Cat *とファイルの順

答えて

3

これを達成するには多くの方法がありますが、そのほとんどは別のプログラムを呼び出してファイルのリストを(優先順位で)生成するのに役立ちます。唯一のbashを使用して(とあなたが手動で、フロントに移動したいファイルの数が少ないと仮定して)、それを達成するための

一つの方法は、次のようになります。あなたが持って来るために複数のファイルがある場合は

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

リストの前、彼らはGLOBIGNOREに含めることができます。

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

GLOBIGNORE環境変数は、GLOを拡大しながら、それらのパターンにマッチするファイルを無視することはbashに指示しますb(*など)。詳細については、bash manualを参照してください。

GLOBIGNOREが誤ってシェルの残りの部分に設定されていないことを確認することが重要です(Timがその点を指摘してくれたため)。上記のように、括弧の中に文全体を入れて、いくつかの方法で達成することができます。あなたがカッコを付けずに実行した場合は、後でGLOBIGNOREを設定しないでください。unset GLOBIGNORE

+0

'&& 'を使わないと、' GLOBIGNORE'変数はそのコマンドの代わりに(そのシェル内で)グローバルに設定されます。 – Tim

+0

おかげさまで、「GLOBIGNORE」は完全に機能しました。 – VictorPrudniy

+0

括弧は必要ありません。 'GLOBIGNORE = vars.css cat vars.css *'または 'GLOBIGNORE = vars.css:other.file cat vars.css other.file *' – Tim

2

ファイルを明示的に指定する必要がありますが、ファイルが最初に来るようにするには拡張パターンを使用するほうが簡単です。

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

!(vars.css)*に似ているが、vars.css以外のすべてと一致します。

それ以外の場合は、vars.cssが他のファイルに対して相対的にソートされるカスタムロケールを定義します。それは本当にシンプルグロブが適しているものではありません。

+0

[Bashのmanページ] /html_node/Pattern-Matching.html)。また、[Linux Journalの記事](http://www.linuxjournal.com/content/bash-extended-globbing)もあります。 – Tim

+0

ありがとう、このソリューションは、これを解決する正しい方法と思われる。 – VictorPrudniy

関連する問題