9つのファイルがあるディレクトリがあります。
- 1は次に終わります
.bat
- 2は次に終わります
.bak
- 4は次に終わります
.txt
- 2は次に終わります
.xtxt
.txt
私の質問は、ピリオドなしで終わるファイルだけを一覧表示するにはどうすればよいですか?だから.txt
私はコマンドを使用せずにエンド4を表示したいと思います。
ls *.txt
ピリオドのあるファイルをフィルタリングしたくないからです。今ワイルドカードについて学んでいるので、ここではワイルドカードを使います。どういうわけかそのコマンドを使うべきだと思いますが!
、どこで使うべきかわかりません。
答え1
私は理解できません。なぜ.
.とにかくインクルードの代わりに特定の文字クラスを使用できますが、.
ディレクトリ内の他のクラスは使用できません。この目的に適した候補は次のとおりです[[:punct:]]
。
LC_ALL=C ls -- *[[:punct:]]txt
C
これに依存する文字クラスにロケールを変更し、正しいファイルで始まるすべてのファイルを一覧表示するオプションを--
追加しました。ls
-
定義:
`[:punct:]'
Punctuation characters; in the `C' locale and ASCII character
encoding, this is `! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \
] ^ _ ` { | } ~'.
答え2
Bashシェルを使用する場合:
shopt -s extglob
ls !(*xtxt|*bak|*bat)
答え3
[!x]txt
で終わるすべてのファイルを一覧表示するために使用されますが、txt
次に終わるファイルは除外されますxtxt
。
ls ./*[!x]txt
(存在する場合は、シェルで履歴拡張をオフにする必要があります。event not found
)
またはASCIIコードを使用してポイントを表示します。例:
ls ./*$'\x2E'txt
または
ls ./*$'\056'txt
答え4
IMO運動へのより一般的な答えはですls *[^x]txt
。
[!x]
私はそれがうまくいくという事実に驚きました。私は!
履歴の完成を強打するのに慣れており、それはまだ二重引用符内の特殊文字であるため、奇妙な問題を引き起こすので、それを避けようとします!
# echo 1
1
# !echo
echo 1
1
# "!echo"
echo 1
1
# echo "the!echo"
echo theecho 1
theecho 1
test
Cのような条件文()[ ! $condition ]
で論理的な否定に使用されることがわかっています。これを使用すると、^
正規表現でも同じであるという利点がありますls | grep [^x]txt$
。 ($
パターンを行末に「固定」します)。