#!/bin/bash # Get directory name from argument, default is . DIR=$ # For each subfolder in DIR (maxdepth limits to one level in depth) find "$" -maxdepth 1 -type d | while read dir; do # Check that there is a file called $dir.grade.xml in this dir dirname=$(basename "$") gradefile="$"/"$".grade.xml if [ -e "$" ]; then sed -i .bak "s/foo/bar/g" "$" else echo "Warning: $ does not contain $" fi done
Kleine Änderungen am Raphink-Rahmen.
Schlüsselpunkte:
- Überprüfen Sie direkt das Vorhandensein von Dateien,
[ -e filename ]
anstatt ls auszuführen - Geben Sie alle Variablen ein
$
. oft nicht unbedingt notwendig, vermeidet aber Mehrdeutigkeit ($
und$name
ist eindeutig verschieden,$variablename
könnte auch bedeuten) - Übergeben Sie eine Erweiterung an sed, um Sicherungsdateien zu erstellen. Dies ist sowohl eine bewährte Methode (für den Fall, dass Ihr Munging schief geht) als auch unter OSX obligatorisch (die Version von raphink interpretiert
s/foo/bar/g
die von Ihnen gewünschte Erweiterung für die Sicherungsdateien) und versucht dann, den Dateinamen als Befehl zu analysieren. - Okay, ich habe gelogen, es ist eigentlich nicht zwingend erforderlich - Sie könnten
sed -i "" "s/foo/bar/g" $
eine leere Erweiterung übergeben, die dazu führen würde, dass sed keine Sicherung macht.