次のファイルのリストがあります。
メイン.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
GLOBIGNORE
Bashには、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' |