Bash 使用ls,如何在不打印扩展名(点后的部分)的情况下列出文件?

Bash 使用ls,如何在不打印扩展名(点后的部分)的情况下列出文件?,bash,ls,Bash,Ls,假设我有一个包含一些文件的目录: $ ls a.c b.c e.c k.cpp s.java 如果没有文件扩展名(点后面的部分,包括该点),如何显示结果?像这样: $ <some command> a b e k s $ A. B E K s 试试看。使用sed ls -1 | sed -e 's/\..*$//' 男子(1)割伤 非常方便,-d开关定义了所需的分隔符和-f字段 编辑:包含场景也是小菜一碟,因为剪切也可以从结尾开始,尽管逻辑有些不同。下面是一个示例,其

假设我有一个包含一些文件的目录:

$ ls
a.c  b.c  e.c  k.cpp  s.java
如果没有文件扩展名(点后面的部分,包括该点),如何显示结果?像这样:

$ <some command>
a
b
e
k
s
$
A.
B
E
K
s
试试看。

使用sed

ls -1 | sed -e 's/\..*$//'
男子(1)割伤

非常方便,-d开关定义了所需的分隔符和-f字段

编辑:包含场景也是小菜一碟,因为剪切也可以从结尾开始,尽管逻辑有些不同。下面是一个示例,其中有一组文件的名称是随机的,有些文件有两个点,有些文件有一个点,有些文件没有扩展名:

runlevel0@ubuntu:~/test$ ls
test.001.rpx  test.003.rpx  test.005.rpx  test.007.rpx  test.009.rpx  testxxx
test.002.rpx  test.004.rpx  test.006.rpx  test.008.rpx  test_nonum    test_xxx.rtv


runlevel0@ubuntu:~/test$ ls | cut  -d "." -f -2
test.001
test.002
test.003
test.004
test.005
test.006
test.007
test.008
test.009
test_nonum
testxxx
test_xxx.rtv
在字段编号之前使用减号可以消除除指示字段(本例中为1,2)以外的所有字段,将其放在后面可以从末尾开始计数

除了字段(参见手册页)的偏移量和字符外,还可以使用相同的表示法。

表示f in*;不打印“%s\n”${f%%.*};完成

${string%%substring}
从$string后面删除最长匹配的$substring

例如,这将处理
mypackage.pkg.tar.xz
-->
mypackage

相比之下:

${string%substring}从$string后面删除$substring的最短匹配项

也就是说,
${string%substring}
只会删除最后的扩展名,即。
mypackage.pkg.tar.xz
-->
mypackage.pkg.tar

在旁注中,优先使用
printf
而不是
echo
。语法稍微复杂一点,但它将在更广泛的系统上工作

如果您只想查看文件,而不想查看目录:

用于f in*;如果[[-f${f}]],则执行此操作;然后printf“%s\n”${f%%.*};fi;完成

如果您已经知道文件的扩展名,可以从手册页使用:

basename-从文件名中删除目录和后缀

不幸的是,如果您试图筛选单个扩展,那么它最有用,在您的情况下,命令是:

basename -s .c -a $(ls *.c) && basename -s .cpp -a $(ls *.cpp) && basename -s .java -a $(ls *.java)
输出:

a
b
e
k
s

FWIW,我会使用
ls|sed's/\(.*\\)\..*/\1/'
仅剥离从最后一个点开始的零件。(另外,请注意目录名中的
,例如,当ls的stdout是管道时,ls../srcls-1和ls的行为相同。实际上并不重要…@rici:
sed-e's/\.[^.]*$/'
@anishsane,是的,或者那样。
s:\.[^./]*$:
会更好。-对于*中的fname;do…@Glenn-这是一个正确的方法,是的。UUOC概念。我认为OP暗示使用ls。显然,Dyno Hungjun Fu也使用ls。这就是我一直在搜索的!!!哇,谢谢!!!!:))文件名可以有多个点,特别是rpm软件包有人能告诉我为什么ls | cut-d“.”-f-2>test.txt不起作用吗?不知道,伙计。我不知道你期望看到什么。我假设您知道必须使用
cat
读取文件,对吗?
basename -s .c -a $(ls *.c) && basename -s .cpp -a $(ls *.cpp) && basename -s .java -a $(ls *.java)
a
b
e
k
s