Bashで複数の例外を提供しながらワイルドカードrmファイルをターゲットにする方法は?

Bashで複数の例外を提供しながらワイルドカードrmファイルをターゲットにする方法は?

次のファイルのリストがあります。

メイン.acn
メインプログラム.acr
メインプログラム.alg
メイン補助ファイル
メインプログラム.glg
メインプログラム.glo
メインプログラム.gls
基本
メインプログラム.lof
メインログ
マスターバッチ
メインプログラム.nlo
メイン出力
メイン.pdf
マスターファイル
メインディレクトリ

main.*以下を除くすべてのファイルをrmしたいと思います。マスターファイルそしてメイン.pdf文書。

試してみましたが、rm main.* !("main.tex","main.pdf")機能せずmain.* 例外なくすべて削除されました。

どんなアイデアがありますか?

答え1

!("main.tex","main.pdf")以外のすべてのものと一致するため、main.tex,main.pdfディレクトリ内のすべてのファイルと一致できます。

注目すべき重要な点は、それ自体がそれらの1つではないものと一致するため、すでに同じ!(...)ように動作することです。*区切り記号はであり、|ではありません,

したがってmain.!(tex|pdf)、動作する必要があります。または、!(main.tex|main.pdf)名前で終わるファイルだけでなく、これら2つのファイルを除くすべてのファイルを削除したい場合main.

望むより:

答え2

あまり複雑でない方法は、アーカイブしたいファイルを保存し、すべてのアイテム(その他)を削除してから、保存したファイルを再保存することです。また、POSIX準拠のソリューションでもあります。

mkdir x                   # File or directory must not already exist
mv main.tex main.pdf x    # Save the files you want to keep
rm ./*                    # Ignore the error about not deleting 'x'
mv x/* .                  # Restore everything you saved. Notice the dot!
rmdir x                   # Tidy up

xここでは、まだ存在していないファイルまたはディレクトリを選択しました。あなた〜するrm削除できないエラーが発生するxことをお勧めします。使用しないでくださいrm -rf

通常、rm ./*ドットファイルはスキップされます。

答え3

GLOBIGNOREBashには、globが返したリストから名前を除外する変数もあります。一例:

$ touch main.pdf main.tex one.pdf one.tex three.wow two.pdf two.tex
$ echo *
main.pdf main.tex one.pdf one.tex three.wow two.pdf two.tex
$ GLOBIGNORE='main.tex:main.pdf'
$ echo *
one.pdf one.tex three.wow two.pdf two.tex

GLOBIGNORE上記の例に示すように、無視する名前を説明する式のコロンで区切られたリストです。あなたの質問は単純なファイル名のペアを除外することですが、glob式を使用することもできます。

$ GLOBIGNORE='one.*:two.*'
$ echo *
main.pdf main.tex three.wow

glob(この例では)と一致する名前のリストは、の式*に基づいて評価されますGLOBIGNORE。式に一致する名前はリストから削除されます。これは便利な機能です。

export多くの場合、たとえばを使用すると便利ですexport GLOBIGNORE='main.tex:main.pdf'

答え4

私はこのような状況に直面するたびにパイプを使用して問題を解決します。

ls -1 メイン。 * | egrep -v '\.pdf|\.tex' |

関連情報