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

时间:2012-12-03 01:52:33

标签: bash ls

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

$ ls
a.c  b.c  e.c  k.cpp  s.java

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

$ <some command>
a
b
e
k
s

5 个答案:

答案 0 :(得分:50)

使用sed?

ls -1 | sed -e 's/\..*$//'

答案 1 :(得分:12)

ls | while read fname 
do
    echo ${fname%%.*}
done

试试。

答案 2 :(得分:7)

ls -a | cut -d "." -f 1
男人(1)切

非常方便,-d开关定义了分隔符和-f你想要的字段。

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

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

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

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

答案 3 :(得分:1)

如果您已经知道文件的扩展名,则可以在手册页中使用basename

基本名称-从文件名中删除目录和后缀

不幸的是,如果您要过滤单个扩展名,那么它最有用,在这种情况下,命令是:

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

输出:

a
b
e
k
s

答案 4 :(得分:0)

for f in *; do printf "%s\n" ${f%%.*}; done

Why it works?

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

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

相反:

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

${string%substring}仅删除最后的扩展名,即 mypackage.pkg.tar.xz-> mypackage.pkg.tar

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

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

for f in *; do if [[ -f ${f} ]]; then printf "%s\n" ${f%%.*}; fi; done