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)"
シェル引用規則をお読みください。