linux只显示文件,ls如何只显示文件名

要列出当前目录下所有的文件名和目录名直接使用ls命令即可。

但如何只列出文件名而不列出目录呢?

查遍了ls 的帮助,也没看到有这个现成的选项。

幸好这个问题还是比较常见的,网上已经有了一些解答,但实验之后,我发现看到的几个链接给出的解决方法都是不完全正确的。具体如下。

一、网上流传的解法

首先,ls

-l 命令可以列出如下格式的完整信息:

drwxr-xr-x 4 junfeng junfeng 4096 2009-11-26 01:04 bin

-rw-r--r-- 1 junfeng junfeng 103 2009-11-26 13:35

CMakeLists.txt

drwxr-xr-x 2 junfeng junfeng 4096 2009-11-26 01:06 src

可以看到,文件和目录的区别在于第一列是d还是-。这就需要在ls的基础上使用grep命令来对ls输出的每一行进行过滤。进一步使用ls

-l | grep ^[^d]或者ls

-l | grep -v ^d命令得到如下结果:

-rw-r--r-- 1 junfeng junfeng 103 2009-11-26 13:35

CMakeLists.txt

现在目录被过滤掉了。grep ^[^d]中,^[^d]

是一个正则表达式,[^d]表示字符串含有一个不是d的字符,^d表示以d开头,^[^d]表示不以d开头。

但有时候只需要获得文件名,需要进一步排除权限,日期等信息,那么再进一步加入awk命令。

ls -l |

grep ^[^d] | awk '{print $8}'

结果如下:

CMakeLists.txt

重新观察之前的结果

-rw-r--r-- 1 junfeng junfeng 103 2009-11-26 13:35

CMakeLists.txt

awk '{print $8}' 中

数字8的含义是第8列(列和列之间以空格符分割),也就是文件名CMakeList.txt这一部分,

二、此方法的漏洞分析和正确的方法(可能)

上述方法有一个重要的漏洞,那就是使用了awk '{print

$8}'命令。前面提到这个命令是以空格符来判断列和列的分隔的。那么如果文件名中就包含空格会怎么样呢

继续实验一下。 运行touch "f ile"创建一个名为"f ile"的文件。注意文件名中的空格。

再重新运行

ls -l |

grep ^[^d] | awk '{print $8}'

结果如下:

CMakeLists.txt

f

果然得到了错误的结果。

仔细阅读文档,发现一个可行而且比较简便的方法:

ls -1 -F |

grep -v [/$]

解释如下:

ls -1 ,

注意这里是数字1,作用是单列输出。

ls

-F:根据文件、目录等信息在文件名或目录名最后给予附加数据结构,例如:

*代表可执行文件;/代表目录;=代表socket文件;|代表FIFO文件;@代表连接文件ls的输出:

bin

CMakeLists.txt f ile src

ls -1的输出:

bin

CMakeLists.txt

f

ile

src

下面看ls -F的输出

bin/

CMakeLists.txt f ile src/

可见目录项的结尾被添加了 '/' 字符。这样便能够简单的区分目录和文件了。

而 grep -v

[/$],[/$]表达式匹配的是以'/'结尾的字符串,而-v选项则是排除这些匹配的字符串。

最后给出linux下正确的只列出当前目录下文件名的方法如下:ls

-1 -F | grep - v[/$]

在我们的例子中执行这个命令的输出如下:

CMakeLists.txt

f ile

linux下正确的只列出当前目录下目录名的方法

1、一般情况下可使用 ls -l | grep

^d ,若只列出目录名: ls -l | grep ^d | awk '{print

$8}'

2、若目录名中有空格,可使用ls -F | grep

[/$],不能写成 ls -F | grep

[*/$], [*/$]表示以*或者/结尾都可以

3、一个最简单的方法,使用 ls -d

*/,可以达到与方法2相同的效果,如 ls -d /boot | sed

's/\///g'

sed

's/old/new/g':以行为单位进行查找替换,注意:要删除“/”需要使用转义字符。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值