見つかった画像ごとに繰り返す次のbash
スクリプトがあります。すべてhtml、cssおよびjsファイル、およびそのファイル内の画像のすべての出現を置き換えます。
for image in app/www/images-theme-dark/*.png
do
echo "installing icon" $image
# extract filename from iconpath
iconfile=$(basename $image)
iconPath="images/"$(basename $image)
# replace paths in all files containing icon paths
find app/www -type f \( -name "*.html" -or -name "*.css" -or -name "*.js" \
-or -name "*.appcache" \) \
-exec sed -i '' -e 's|$iconPath|images-theme-dark/$iconfile|g' "{}" \;
done
ただし、スクリプトを実行すると、sed
は次のようになります。
sed: can't read : No such file or directory
StackOverflowで見つけた sed:読み込めません:そのようなファイルやディレクトリはありません しかし、すでに{}
sed
コマンドをエコーし、コマンドラインで手動で実行してもエラーはありません。
Raspbian GNU/Linux 8.0(jessie)でGNU sed v4.2.2を使用しています
ここで間違っている可能性があるものを誰かが見ていますか?
(コメントから回答を編集するためのノウハウは、メルポメンとAlexPによるものです。)
''
の後のsed -i
とは何ですか?
-i
はインプレース、つまりファイルを直接編集することを意味します。-i ''
は、名前が空の文字列であるファイルをその場で編集することを意味します。
名前が空の文字列であるファイルはおそらくないので、sedはそれを読み取れないと文句を言います。
注1 プラットフォーム依存関係:-i
の構文は、GNU sedとmacからのsedの違いの1つです。
注2 「通常の」引数の順序:
sedコードがファイル名の間に挿入できることを示す-e
スイッチ。
これは、sedコマンドラインのどこにあるかという期待を超えてトリップすることによる、trapです(たとえば、私は恥ずかしく思われました)。
許可sed -i filename -e "expression" AnotherFileName
これは、意図せずに偽装されたバージョンですsed -i'NoExtensionGiven' "expression" filename AnotherFileName
。
OSXとLinuxの両方でサポートするには、bashスクリプトがOSXまたはLinuxで実行されているかどうかを確認する単純なifチェックを使用し、コマンドの-i
引数はそれに基づいています。
if [[ "$OSTYPE" == "darwin"* ]]; then
sed -i '' -e 's|$iconPath|images-theme-dark/$iconfile|g' "{}"
else
sed -i -e 's|$iconPath|images-theme-dark/$iconfile|g' "{}"
fi