通配符:如何列出仅以“.txt”结尾的文件而不使用点字符?

通配符:如何列出仅以“.txt”结尾的文件而不使用点字符?

我有一个目录,其中有九个文件。

  • 1 结尾于.bat
  • 2 结束于.bak
  • 4 结束于.txt
  • 2 结束于.xtxt

我的问题是,如何仅列出以 结尾的文件.txt,但不使用句点。所以我想显示以 结尾的 4 .txt,而不使用命令

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 shell:

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

答案3

用于[!x]txt列出以 结尾的所有文件txt,但排除以 结尾的文件xtxt

ls ./*[!x]txt

(如果出现 ,则可能需要在 shell 中关闭历史扩展event not found
或使用 ASCII 代码表示点,例如:

ls ./*$'\x2E'txt

或者

ls ./*$'\056'txt

答案4

IMO 对你的练习更常见的答案是ls *[^x]txt

我很惊讶它的[!x]效果同样好。我习惯了!bash 历史记录补全,并导致奇怪的问题,因为它仍然是双引号内的特殊字符,所以我只是尽量避免它!

# echo 1
1
# !echo
echo 1
1
# "!echo"
echo 1
1
# echo "the!echo"
echo theecho 1
theecho 1

我知道它用于test条件 ( [ ! $condition ]) 中的逻辑否定,例如 C。使用它的好处^是它在正则表达式中是相同的:ls | grep [^x]txt$。 ($将模式“锚定”到行尾)。

相关内容