9つのファイルを含むディレクトリがあります。
.bat
の1.bak
.txt
の4.xtxt
私の質問は、ピリオドを使用せずに、.txt
で終わるファイルのみを一覧表示する方法です。したがって、コマンドを使用せずに、.txt
で終わる4つを表示したい
ls *.txt
ファイルを除外するためにピリオドを使用したくないので。現在、ワイルドカードを学習しているため、ワイルドカードを使用しています。どういうわけか!
コマンドを使用する必要があると思いますが、どこで使用するかわかりません。
わからないなぜ.
を使いたくない。とにかく、代わりに.
が含まれる文字クラスを使用できますが、ディレクトリの他の文字は使用できません。この目的に適した候補は[[:punct:]]
です。
LC_ALL=C ls -- *[[:punct:]]txt
文字クラスが依存するため、ロケールをC
に変更し、--
で始まるすべてのファイルを適切にリストするために-
をls
に追加しました。
定義:
`[:punct:]'
Punctuation characters; in the `C' locale and ASCII character
encoding, this is `! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \
] ^ _ ` { | } ~'.
Bashシェルを使用している場合:
shopt -s extglob
ls !(*xtxt|*bak|*bat)
[!x]txt
を使用すると、txt
で終わるすべてのファイルがリストされますが、xtxt
で終わるファイルは除外されます。
ls ./*[!x]txt
(event not found
を取得した場合は、シェルで履歴の展開をオフにする必要がある場合があります)
またはASCIIドットのコードを使用します。例:
ls ./*$'\x2E'txt
または
ls ./*$'\056'txt
これは_find . -type f -name "*.txt"
_を使用して簡単に実現できますが、_.
_をそこに配置したくない場合、そのディレクトリで見つけるファイル拡張子は_.bat
_、_.bak
_、_.txt
_、および_.xtxt
_の場合、これを試すことができます。
_ls *txt | grep -v "xtxt$"
_
_ls *txt
_はtxt
で終わるすべてのものをもたらし、_grep -v "xtxt$"
_はxtxt
で終わるものを結果に表示しないようにします。
この質問は誤解に基づいていると思います。ドットは、完全な正規表現で特別な意味を持っています。つまり、任意の文字を意味します。ただし、シェルでのファイル名の展開には、ドットが特別な意味をまったく持たない、はるかに単純なパターン言語である「グロブ」を使用します。だからあなたはそれを安全に使うことができます:
% touch foo.txt foomtxt
% ls
foo.txt
foomtxt
% ls *.txt
foo.txt