#!/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
Незначительные изменения в структуре Raphink.
Ключевые моменты:
- проверять напрямую наличие файлов,
[ -e filename ]
а не запускать ls - положить все переменные в
$
; часто не является строго необходимым, но избегает двусмысленности ($
и$name
явно различимы,$variablename
может означать и другое) - передать расширение для создания резервных копий файлов. Это и хорошая практика (в случае, если ваш манжинг работает неправильно), и, в OSX, обязательная (версия raphink интерпретируется
s/foo/bar/g
как расширение, которое вы хотите для файлов резервных копий, затем пытается проанализировать имя файла как команду. - Ладно, я соврал, это на самом деле не обязательно - вы можете использовать
sed -i "" "s/foo/bar/g" $
для передачи пустого расширения, что приведет к тому, что sed не сделает резервную копию.