拡張子に従ってファイルを削除するスクリプト

拡張子に従ってファイルを削除するスクリプト

スクリプトを使用してファイル拡張子リストにある拡張子を持つすべてのファイルを削除するにはどうすればよいですか?このリストは、他のプログラムの実行時に生成される複数のファイルを簡単に削除する必要があるため、スクリプト自体に含める必要があります。

存在しない場合は、エラーを返さずに現在のディレクトリ(サブディレクトリなし)から特定の拡張子を持つすべてのファイルのみを削除したいと思います。

端末でスクリプトを実行したいです。拡張子は常に同じです。たとえば、他のプログラムによって生成されたいくつかの.logと.txtを削除する必要がありますが、必要はないため、コマンドライン引数は必要ありません$ myscript

私はbashスクリプトについて何も知りません。いくつかのテストを書いたが、うまくいかなかったので削除しました。擬似コードでは、次のようにする必要があります。

myexts = .log, .txt, .somethingelse
for ext in myexts:
    if exists *.ext
        delete *.ext

ilkkachuが提案したコードを試しましたが、

$ ./myscript
find: ‘’: No such file or directory
find: ‘’: No such file or directory
find: ‘’: No such file or directory

リストの拡張子を変更し、元のリストの拡張子でファイルを作成してみましたが、常にこのエラーが発生します。

答え1

Bashまたはkshがあるとします。

#!/bin/bash
extensions=(c~ h~ bak)
for e in "${extensions[@]}"; do
    find . -name "*.$e" -delete
done

または、後者がない場合は-exec rm -- {} +置き換えることができます。もちろん、削除するファイルを最初に見ずにテストを実行したい場合があります。-deletefind-delete

上記のコマンドは、すべてのサブディレクトリのファイルを削除します。サブディレクトリではなく現在のディレクトリのファイルのみを削除するには、次のようにrmしますfind

#!/bin/bash
extensions=(c~ h~ bak)
shopt -s nullglob
for e in "${extensions[@]}"; do
    rm ./*."$e"
done

または単に

#!/bin/bash
shopt -s nullglob
rm -- *.c~ *.h~ *.bak

より一般的なバージョンでは、ディレクトリと拡張子をスクリプトの引数として使用します。

#!/bin/sh
dir=$1
shift
for e in "$@"; do
    find "$dir" -name "*.$e" -delete
done

あなたはそれを実行するために使用することができますrmscript.sh /some/target/dir c~ h~ bak

関連情報