一部のファイルを除く*.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 {} +

答え2

いくつかの方法があります:

  • findを使用する(特定のシェル[bash]が不要なので移植可能)
探す。 -最大深さ1! - 名前「除外」 - 削除

または複数のモードがある場合:

探す。 -最大深さ1! \(-name "除外" -o -name "除外 2"\)-exec rm -f {}\+
  • GLOBIGNORE変数の使用(bashのみ)
エクスポート GLOBIGNORE=除外:除外1:マスク*

これにより、前述のファイルとマスクが完全に除外されます。その後、指定できますrm your_pattern

まず試してみてください。ls

答え3

ぜひ探していただきたいです。しかし、問題はスペースです。

rm /path/to/directory/!("file1" | "file2")

同じですか? rm "/path/to/directory/!(file1" "|" "file2)"

いいえ rm "/path/to/directory/!(file1|file2)"

シェル引用規則をお読みください。

関連情報