一部のファイルを除く*.mp4、*.zipすべて削除

一部のファイルを除く*.mp4、*.zipすべて削除

bash私のプログラムの1つからディレクトリ内のすべてのファイルを削除するコマンドを呼び出しますが、そのいくつかは次のとおりです。

bash -c
shopt -s extglob
shopt -s nullglob
rm /path/to/directory/!("file1" | "file2")

私が理解したのは、「このコマンドにbashを使用し、拡張モードを使用して、このファイルを除くすべてのファイルを削除してください」という意味です。

うまくいきますが、コマンド内のファイルを除くすべてのファイルを削除します。

私が望むのは、ディレクトリ内のすべての.mp4と.zipを削除し、コマンドに入れたものを削除することです。

コマンドのどこかに*.mp4と*.zipを追加する必要があるようですが、どこにいるのかわかりません。

編集:わかりやすくするために必要なのは、「すべての.mp4ファイルと.zipファイルを削除しますが、このファイルは保持する」ことです。

ベストアンサー1

このパターンは、スペースを除くすべてのファイルと!("file1" | "file2")一致します。file1␣あなたがそれを言及する方法は誤解を招くかもしれません:それはor)と同じです。␣file2!(file1 | file2)!("file1 "|" file2

Bashでは、「それを除くすべて」を意味するために、負モードと正モードを組み合わせる方法はありません。 zshではこれを書くことができます

setopt extended_glob
rm /path/to/directory/*.(mp4|zip)~(keep*|1234.zip)

this.mp4とは削除しますthat.zipが、keep-this.mp4またはは削除しません1234.zip

Bashでは設定できますGLOBIGNORE変えるすべての一致から特定のパターンを除外します。

shopt -s extglob
GLOBIGNORE='keep*:1234.zip'
rm /path/to/directory/*.(mp4|zip)
unset GLOBIGNORE

findあるいは、任意に複雑な性格のブール式を書くこともできます。

find /path/to/directory \( -name '*.mp4' -o -name '*.zip' \) ! -name 'keep*' ! -name '1234.zip' -delete

findサブディレクトリへの再帰を確認してください。必要でない場合は-maxdepth 1後で追加してください/path/to/directory

findわからない場合は(-maxdepth一般的ですが標準ではありません)、代わりに使用してください-type d -prune -o。 (同じ説明)findわからない場合は、代わりにその説明を使用してください。-delete-exec rm {} +

おすすめ記事