web-dev-qa-db-ja.com

「.c」で終わらないファイルを削除するにはどうすればよいですか?

すべてのCプログラムを含むディレクトリがあります。また、コードをチェックするために、作成時にそれらをコンパイルしました。 100近くのプログラムがたくさんあります。したがって、ファイルが「.c」で終わるかどうかをチェックするBASHスクリプトが必要です。実行する場合は何も実行せず、実行しない場合は削除します。私のファイル名の1つが「Hello.c」であるとすると、コンパイル時にそのバイナリに「Hello」という名前を付けました。それで、誰かが私のためにこのスクリプトを作ることができますか?

5
Pranit Bauva

find-deleteフラグを使用できます(-lsを使用した最初のテスト)

find -not -name "*.c" -delete

findを使用したくないが、現在のディレクトリ内のファイルのみを使用する場合は、

rm !(*.c)

bashで、shopt -s extglobを使用して正しいグロブが設定されていることを確認してください。さらに、globstarセット(shopt -s globstar)がある場合は、再帰的に動作できます(4を超えるbashバージョンの場合)。

rm **/!(*.c)
21
Bernhard

そのような場合、私は常にfindを好みます。特別なファイル名について心配する必要はなく、さまざまなファイルタイプを処理できます。ファイルのみを削除したい場合は、オプションに-type fを追加する必要があります。だから私のお気に入りの解決策は:

find -not -name "*.c" -type f -delete

ただし、注意してください。このようなコマンドをテストすることは常に良い考えです。

5
Ronin Tom

コマンド_shopt -s extglob_を使用してksh拡張 ワイルドカードパターン をアクティブにします(これを_~/.bashrc_に入れることができます)。次に、パターン!(*.c)は、_*.c_に一致するファイルを除く、現在のディレクトリ内のすべてのファイルに一致します。

_rm !(*.c)
_

これは、_.txt_ファイル、_.h_ファイルなどを削除するため、かなり危険です。それほど抜本的なコマンドではありません。

_rm !(*.*) *.o
_

これでもREADMEMakefileなどは削除されます。実行可能ファイルのみを削除する必要があります。

_find . -type d -Prune -o -type f -perm -100 -exec rm {} +
_

短い場合、findがサポートしている場合:

_find . -maxdepth 1 -type f -perm -100 -delete
_