いくつかの拡張機能を除いてすべて削除

いくつかの拡張機能を除いてすべて削除

rm正規表現を使用してコマンドを変更したり、何かを削除したりできますか?現在のディレクトリ内のすべてのファイル(拡張子が?であるファイルを除く)*.bmpには、または同じファイルがあるため、大文字と小文字を区別しないでください。*.wav*.png*.BMP*.bMP

答え1

@ChrisDownが提供しました。離れbashこれは、ファイルとディレクトリの違いと、削除するファイルがないかどうかを考慮します。

ただしrm、このような場合は失敗するため、次のようにコマンドを単純化できます(続行できますbash)。

shopt -s extglob nocaseglob
rm -- !(*.bmp|*.wav|*.png)

両方のシェルオプションをデフォルト値にリセットすることを忘れないでください。私の場合は、extglobインタラクティブシェルにすでに設定されているので、必要なだけでした。

shopt -u nocaseglob

または、サブシェルで次の2つのコマンドを実行します。

(shopt -s extglob nocaseglob
rm -- !(*.bmp|*.wav|*.png))

rmどのファイルが削除されるかを事前に確認するにはecho

隠しファイルも削除するには、そのdotglobオプションを追加してください。

答え2

bashを使用する場合と を組み合わせて使用​​できます。extglobnocaseglob

shopt -s extglob nocaseglob
for file in !(@(*.bmp|*.wav|*.png)); do
    [[ -f "${file}" ]] && files+=( "${file}" )
done
(( ${#files[@]} )) && rm "${files[@]}"

それ以外の場合は、次のようにできます。

find . -maxdepth 1 -type f ! \( -iname '*.bmp' -o -iname '*.wav' -o \
    -iname '*.png' \) -delete

答え3

使用 zsh、削除定期的な.bmp、、.pngを除くファイル.wav(大文字と小文字の区別):

setopt extendedglob # best in ~/.zshrc
rm -- ^*.(#i)(png|bmp|wav)(D.)

D拡張子に関係なく隠しファイルを保持したい場合は、上記の項目を削除してください。)

答え4

誤って愚かなことをしないようにしばらく時間をかけて、いくつかの手順を実行することをお勧めします。

  1. 削除するファイルを識別するコマンドを作成します。

        ls | grep -v *.bmp | grep -v *.wav  # current directory
    

    または

        find . -type f | grep -v *.bmp      # current and sub directories
    

    返されたファイルのリストが削除したいファイルの場合

  2. 最後のコマンドを呼び出してxargs rmこのコマンドを追加します。

        ls | grep -v *.bmp | grep -v *.wav | xargs rm
    

関連情報