2016-07-20 17 views
0

Ich versuche, den folgenden Befehl zu verwenden:Bash: ein Befehl auf alle Dateien mit der Erweiterung ausführen rekursiv

herbalizer file_name.haml > file_name.erb 

Hier die file_name.haml ist der Dateiname, offensichtlich.

Wie kann ich diesen Befehl auf alle haml Dateien im aktuellen Verzeichnis rekursiv auf alle Unterverzeichnisse anwenden? Dateiname sollte die gleiche wie oben erwähnt bleiben, so abc.haml Anwendung auf herbalizer abc.haml > abc.erb

wäre Bisher: find . -type f -exec herbalizer {} \;

Antwort

2

Sie sind ziemlich nah. Sie können basename verwenden, um die Erweiterung des Namens jeder Datei strippen Sie finden:

find . -type f -name \*.haml -exec sh -c 'herbalizer "{}" > "$(dirname {})/$(basename {} .haml).erb"' \; 

ich die I/O-Umleitung in einer Shell-Befehlszeile gewickelt. Dateinamen sind in Anführungszeichen eingeschlossen, falls ein Dateiname oder eine Pfadkomponente Leerzeichen enthält.

PS. Das hat dir die Arbeit gemacht, aber es war nicht sehr elegant; also hier ist eine Alternative, die bash eingebauten Ersatz verwendet:

find . -type f -name \*.haml -exec bash -c 'FN="{}"; herbalizer "{}" > "${FN%.haml}.erb"' \; 
+0

Entschuldigung, ich habe es mit dem Zitat übertrieben. Jetzt behoben. – alexis

+2

Vielen Dank, wenn Sie auf das aktuelle Verzeichnis anwenden, sieht es so aus, als ob der Baum nicht länger gepflegt wird. Haml-Dateien werden gelöscht und neue Dateien werden im aktuellen Verzeichnis anstelle des jeweiligen Verzeichnisses erstellt. –

+0

Als wäre der angegebene Bereich immer das aktuelle Verzeichnis und nicht das Verzeichnis, in dem sich die Dateien befinden. –

3

können Sie verwenden basename, dirname und find Ihre gewünschten Ergebnisse zu erhalten:

find . -type f -name "*.haml" | while read fname 
> do 
> herbalizer ${fname} > $(dirname $fname)/$(basename $fname .haml).erb 
> done 

Eine weitere einfache Methode, wie in den Kommentaren Abschnitte vorgeschlagen durch @ Dummy00001 ist:

find . -type f -name "*.haml" | while read fname 
> do 
> herbalizer ${fname} > ${fname%.haml}.erb 
> done 

Weitere Referenz: Parameter substitution

+2

Sie können '$ (dirname $ fname)/$ (basename $ fname .haml) .erb' durch' $ {fname% .haml} .erb' ersetzen. – Dummy00001

Verwandte Themen