我有一个目录,其中有九个文件。
- 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$
。 ($
将模式“锚定”到行尾)。