1

順番に名前が付けられたCソースファイルがたくさんあります(たとえばf1.c、など)。f2.cf3.c

私のMakefileには、以前は次のclean:ような定義があります。

rm -f f1
rm -rf f1.dSYM
rm -f f2
rm -rf f2.dSYM
# etc

だから私はそれを正規表現に置き換えたかったのですが、コマンドラインに直接入力するとうまくいきます:

ls | grep -P ^f[0-9]+(|\.dSYM)$ | xargs rm -rf

ただし、そのコマンドをクリーンな定義に入れると、実行するmake cleanと次のようになります。

$ make clean
ls | grep -P ^f[0-9]+(|\.dSYM)| xargs rm -rf
/bin/sh: -c: line 0: syntax error near unexpected token `('
/bin/sh: -c: line 0: `ls | grep -P ^ex[0-9]+(|\.dSYM)| xargs rm -rf'
make: *** [clean] Error 2

正規表現に構文エラーの原因となる特殊文字がいくつかあると思います...引用符で囲んでエスケープしようとしましたが、実際には何も役に立ちません。Makefile内でこれを機能させる方法を知っている人はいますか?

4

4 に答える 4

5

$(wildcard)派生ファイル名を取得するためにCソースとパターン置換を見つけるために使用するさらに別の解決策:

SOURCES := $(wildcard f[0-9]*.c)

clean :
    rm -f $(SOURCES:.c=)
    rm -rf $(SOURCES:.c=.dSYM)
于 2012-06-03T22:05:04.283 に答える
4
ls | grep

の役に立たない使用法ですlshttp://porkmail.org/era/unix/award.html#ls

rm -rf f[0-9] f[0-9]*[0-9] f[0-9]*.dSYM

明確に、グロビンを使用します。http://mywiki.wooledge.org/globを参照してください。

于 2012-06-03T21:44:39.370 に答える
1

直接的な解決策:正規表現を引用します。より良い解決策:グロブ、ブレース拡張、および/またはfind ... -delete

rm -rf f{1,2}{,.dSYM}
rm -rf f? f?.dSYM
ffind . -regex '.*/f[0-9]' -o -regex '.*/f[0-9].dSYM' -delete
于 2012-06-03T21:50:42.917 に答える
0

コマンドラインシェルは、おそらくシェルがmake使用するものとは異なります。/bin/bashコマンドラインで使用すると思いますが/bin/sh、デフォルトで使用します。接頭辞を付けることで変更できます

SHELL=/bin/bash

Makefileに。

縦棒と括弧の周りに引用符を追加することは、引用符なしで使用するよりも常に安全です。また、特殊文字として扱われないように、Makefileではドル記号を2倍にする必要があることに注意してください。

于 2012-06-03T21:45:07.700 に答える