使用ls,如何列出文件而不打印扩展名(点后面的部分)?

Yis*_*ang 35 bash ls

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

$ ls
a.c  b.c  e.c  k.cpp  s.java
Run Code Online (Sandbox Code Playgroud)

如何在没有文件扩展名的情况下显示结果(点后面的部分,包括该点)?像这样:

$ <some command>
a
b
e
k
s
Run Code Online (Sandbox Code Playgroud)

Dyn*_* Fu 55

用sed?

ls -1 | sed -e 's/\..*$//'
Run Code Online (Sandbox Code Playgroud)

  • FWIW,我会用`ls | sed's/\(.*\)\ ..*/\1 /'`仅剥离以*last*dot开头的部分.(另外,请注意目录名中的`.`,例如ls ../src (8认同)
  • @rici:`sed -e's /\.[^.]*$//'` (4认同)
  • 当ls的stdout是管道时,ls -1和ls的行为相同.真的没关系...... (2认同)

jim*_*ara 13

ls | while read fname 
do
    echo ${fname%%.*}
done
Run Code Online (Sandbox Code Playgroud)

试试吧.

  • [不解析ls](http://mywiki.wooledge.org/ParsingLs) - `for fname in*; 做......` (9认同)

run*_*el0 7

ls -a | cut -d "." -f 1
Run Code Online (Sandbox Code Playgroud)

男人(1)切

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

编辑:包括riverfall的场景也是件小事,因为切割也可以从最后开始,尽管逻辑有些不同.这里有一组带有随机名称的文件的示例,一些带有两个点,一些带有一个点,一些带有无扩展名:

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
Run Code Online (Sandbox Code Playgroud)

使用字段编号之前的减号使它消除所有BUT指示的字段(在这种情况下为1,2)并将其置于后面使其从结束开始计数.

除了字段之外,相同的表示法可用于偏移和字符(参见手册页)