グローバルマッチングからパターンを除外

グローバルマッチングからパターンを除外

デフォルトのファイル名が同じファイルが複数あります。一つだけ除いて全て削除したい

foo.org #keep
foo.tex #delete
foo.fls #delete
foo.bib #delete
etc

1つを保管する必要がない場合は使用できることがわかりますrm foo.*

TLDP否定一致を示します^。試行錯誤を経て調べたのは

rm foo.*[^org]

必要な作業を行いますが、構文をよく理解していません。

また、これは私のユースケースの制限ではありませんが、このパターンはfoo.ofoo.or。このモードの仕組みと無視されたグロブに発生する現象ただ foo.orgそうですか?

答え1

shopt -s extglob
echo rm foo.!(org)

これはfoo.NOTに続くすべての項目と一致します。org

後で正常なグローバル動作を復元するには、次のようにします。

shopt -u extglob

引用:GNU Bashリファレンスマニュアル

答え2

BashではGLOBIGNORE="*.org"; rm -i foo*

unset GLOBIGNORE終わった後。

に比べて良くありませんが、shopt -s extglob覚えやすいです。

答え3

パイプは何ができますか?

ls * | grep -v "foo.org" | xargs -I {} echo {}

(明らかに最後のチェーンでechoをrmに変更したいかもしれません)。

答え4

もう一つの方法です。foo.shジョブから除外したいファイルがいくつかありますが、csv他のファイルはすべて追加したいとします。次のループを使用できます。

for f in *; do
  if [ "${f: -3}" != ".sh" ]; then
    mv "$f" "${f%}.csv"
  fi
done

関連情報