web-dev-qa-db-ja.com

ワイルドカード:ドット文字を使用せずに「.txt」だけで終わるファイルをリストするにはどうすればよいですか?

9つのファイルを含むディレクトリがあります。

  • 末尾が.batの1
  • 2で終わる.bak
  • 末尾が.txtの4
  • 2で終わる.xtxt

私の質問は、ピリオドを使用せずに、.txtで終わるファイルのみを一覧表示する方法です。したがって、コマンドを使用せずに、.txtで終わる4つを表示したい

ls *.txt

ファイルを除外するためにピリオドを使用したくないので。現在、ワイルドカードを学習しているため、ワイルドカードを使用しています。どういうわけか!コマンドを使用する必要があると思いますが、どこで使用するかわかりません。

4
NLB1067

わからないなぜ.を使いたくない。とにかく、代わりに.が含まれる文字クラスを使用できますが、ディレクトリの他の文字は使用できません。この目的に適した候補は[[:punct:]]です。

LC_ALL=C ls -- *[[:punct:]]txt

文字クラスが依存するため、ロケールをCに変更し、--で始まるすべてのファイルを適切にリストするために-lsに追加しました。


定義:

`[:punct:]'
     Punctuation characters; in the `C' locale and ASCII character
     encoding, this is `! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \
     ] ^ _ ` { | } ~'.
3
jimmij

Bashシェルを使用している場合:

shopt -s extglob
ls !(*xtxt|*bak|*bat)
3
fpmurphy

[!x]txtを使用すると、txtで終わるすべてのファイルがリストされますが、xtxtで終わるファイルは除外されます。

ls ./*[!x]txt

event not foundを取得した場合は、シェルで履歴の展開をオフにする必要がある場合があります)
またはASCIIドットのコードを使用します。例:

ls ./*$'\x2E'txt

または

ls ./*$'\056'txt
3
don_crissti

これは_find . -type f -name "*.txt"_を使用して簡単に実現できますが、_._をそこに配置したくない場合、そのディレクトリで見つけるファイル拡張子は_.bat_、_.bak_、_.txt_、および_.xtxt_の場合、これを試すことができます。

_ls *txt | grep -v "xtxt$"
_

_ls *txt_はtxtで終わるすべてのものをもたらし、_grep -v "xtxt$"_はxtxtで終わるものを結果に表示しないようにします。

2
jimm-cl

この質問は誤解に基づいていると思います。ドットは、完全な正規表現で特別な意味を持っています。つまり、任意の文字を意味します。ただし、シェルでのファイル名の展開には、ドットが特別な意味をまったく持たない、はるかに単純なパターン言語である「グロブ」を使用します。だからあなたはそれを安全に使うことができます:

% touch foo.txt foomtxt
% ls
foo.txt
foomtxt
% ls *.txt
foo.txt
0
alexis