2016-07-29 8 views
0

ich eine Ausgabedatei suchen zu erzeugen, die das Ergebnis des folgenden Befehls enthält:„für jeden in“ Standardausgabe bash

cd /path/to/files/; for each in *; do cat $each; echo "######_NEW_FILE_######"; done 

ich versucht habe:

cd /path/to/files/; for each in *; do cat $each; echo "######_NEW_FILE_######"; > output.txt; done 

Dies erzeugt die Datei , aber es ist leer. Ich habe auch versucht:

cd /path/to/files/; for each in *; do cat $each; echo "######_NEW_FILE_######"; done; >output.txt 

Dies erzeugt eine Datei, die viel zu groß ist. Das ist nicht was ich suche. Danke für die Hilfe.

+2

Zu groß ?, Sie wollen nicht den gesamten Inhalt dieser Dateien in dieser Datei? –

+0

... Ich meine, es gibt ein paar offensichtliche Bugs, die nicht aufzählen, aber es würde helfen, wenn Sie beschreiben, was genau "zu groß" in diesem Zusammenhang bedeutet. –

+0

Möchten Sie nur das Ergebnis von Echo in der Datei oder den Inhalt dieser Dateien + das Echo Ergebnis? –

Antwort

3

Wenn Sie eine Umleitung in Platz für einen Block von Befehlen haben wollen, ohne die Auswirkungen auf die Leistung und andere Nebenwirkungen in einer Subshell beteiligt, steckte es in Klammern:

{ 
    cd /path/to/files/; for each in *; do cat "$each"; echo "######_NEW_FILE_######"; done 
} >output.txt 

... als Einzeiler, sollten Sie ein ; vor der schließenden Klammer setzen:

{ cd /path/to/files/; for each in *; do cat "$each"; echo "######_NEW_FILE_######"; done; } >output.txt 

Nebenbei bemerkt, es ist cat "$each", nicht cat $each. Wenn Sie eine Datei mit touch '*' erstellt haben, würden Sie sonst Ihre Ausgabegröße verdoppeln.


Das heißt, das ist in der Tat sehr fast identisch mit:

cd /path/to/files/; for each in *; do cat "$each"; echo "######_NEW_FILE_######"; done >output.txt 

..., für die die >output.txt zum for Schleife (und nur der Schleife) gilt. Der Unterschied ist also, dass der { ... } Ansatz auch alle stdout von dem cd Befehl umleitet (für den es keine geben sollte, es sei denn, Sie haben es mit einem Shell-Funktions-Wrapper oder Ähnlichem neu definiert).

Das heißt:

# this does not redirect the header 
cd /path/to/files; echo "header"; for each in *; do cat "$each"; done >output 

# this does not redirect the header or the loop 
cd /path/to/files; echo "header"; for each in *; do cat "$each"; done; echo footer >output 

# this redirects everything 
{ cd /path/to/files; echo "header"; for each in *; do cat "$each"; done; echo footer; } >output 
1

Diese:

... echo $each"######_NEW_FILE_######"; > output.txt 
             ^--- 

beenden Sie die echo mit diesen ;, so dass > output.txt einer Aussage völlig unabhängig von dem Echo.

Sie wollen

... echo '...' > output.txt; etc... 
          ^---note 
0

Das Semikolon, die done beendet die Anweisung folgt, was bedeutet, dass die Umleitung nicht mit einem Befehl zugeordnet ist.

Verlieren Sie die letzte ; und es sollte funktionieren.