列出目录中的文件,但不列出该目录中的子目录及其内容


24

我想创建一个目录中所有文件的列表,而不列出该目录中的任何子目录,并将该列表打印到一个新文件中。

ls -d * > filelist

将创建当前目录中所有文件的列表,但它还会列出当前目录中的子目录。我find使用-maxdepth 1选项尝试了命令-但是,输出格式是一个问题,因为find还会打印出路径以及文件名。

如果有人可以告诉我,也许可以使用另一个命令或选项来生成目录中文件的输出列表,而不是子目录名称或其内容的输出列表,我将不胜感激。


2
我很困惑,ls -d *只列出了当前文件夹中的文件和文件夹,不包括这里隐藏的文件/文件夹;
GM-Script-Writer-62850

是的,但是我不想列出该目录中的文件夹,只希望列出该目录中的文件
janet

Answers:


22

基于查找的解决方案:

find . -maxdepth 1 -type f -printf '%f\n'

基于Bash的解决方案:

for f in *; do [[ -d "$f" ]] || echo "$f"; done
##  or, if you want coloured output:
for f in *; do [[ -d "$f" ]] || ls -- "$f"; done

基于bash的解决方案将为您提供目录以外的所有内容。它将包括诸如命名管道之类的东西(您可能需要这样做)。如果您想要file,请使用find命令或以下命令之一:

for f in *; do [[ -f "$f" ]] && echo "$f"; done
##  or, if you want coloured output:
for f in *; do [[ -f "$f" ]] && ls -- "$f"; done

如果您打算定期使用此功能,则当然可以将其放入别名中~/.bashrc

alias lsfiles='for f in *; do [[ -f "$f" ]] && ls -- "$f"; done'

既然您在注释中指出您实际上是在OSX而不是Ubuntu上,那么我建议您下次将问题直接发送给Apple或更通用的Unix&Linux Stack Exchange网站。


1
请确保根据您是否要包含隐藏文件来检查这些解决方案是否适合您。
凯文·惠勒

10

仅列出文件名:

1. ls -p | grep -v /(无隐藏文件)
 2. ls -l | grep ^-| tr -s''| 剪切-d''-f 9(无隐藏文件)

 a)ls -pa | grep -v /(带有隐藏文件)
 b)ls -la | grep ^-| tr -s''| 剪切-d''-f(带有隐藏文件)

仅列出目录:

1. ls -p | grep /(无隐藏)
 2. ls -l | grep ^ d | tr -s''| 切-d''-f 9(无隐藏)

 a)ls -pa | grep /(隐藏)
 b)ls -l | grep ^ d | tr -s''| 切-d''-f 9(隐藏)

grep -v -e ^ $用于从结果中删除空白行。

更多详细信息
ls -p标志将'/'放在目录名的末尾,-R标志用于递归搜索,-l用于列出信息,-a用于列出所有(包括隐藏文件)信息,grep -v标志用于结果反转,-e标志用于正则表达式匹配。


7

仅列出常规文件:

ls -al | grep ^-

带有符号链接:

ls -al | grep ^[-l]

列表的第一个字符描述文件的类型,因此-表示它是常规文件,因为符号链接为l

Debian / Ubuntu

打印所有匹配文件的名称(包括链接):

run-parts --list --regex . .

使用绝对路径:

run-parts --list --regex . $PWD

打印/etcp结尾的所有文件的名称d

run-parts --list --regex '^p.*d$' /etc

5

还有另一种解决方案,对我有用的天真短促的解决方案:

ls -la | grep -E '^[^d]' > files

最适合我ls -alR |grep -E '^-'
在这里

4

我建议使用find,并在必要时从输出中删除目录名称:

find . -type f -maxdepth 1 | sed s,^./,,

2
-maxdepth 1应该在任何过滤器之前出现,并且无需使用sed-printf选项即可实现此结果,即:(find . -maxdepth 1 -type f -printf '%f\n'这比使用其他程序更有效)。
evilsoup

3
ls -1 --file-type | grep -v '/' | sed s/@$// > filelist

另一个可能的选择是

ls -F | grep -v '/' | sed /[@*]$// > filelist

--file-type在文件夹(也以符号链接。到底@结束看跌期权A / The grep -v '/'删除子目录(因为他们现在用“/”)。该sed s/@$//删除该@。-1打印每行一个文件这样grep -v才能正常工作。


感谢您的答复。不幸的是,它对我不起作用,也许我执行不正确。如果我使用您给我的确切命令,则会出现以下错误:ls:非法选项--用法:ls [-ABCFGHLPRSTWabcdefghiklmnopqrstuwx1] [文件...]我尝试使用*通配符代替和与--file-type结合使用。如果您能澄清一下,我将不胜感激!
珍妮特

该命令对我有用(运行13.04),您使用的是哪个版本的ubuntu?-1与grep无关紧要,您不需要它;如果要包括隐藏文件使用的-a选项上ls
GM-脚本的作家-62850

实际上,我在Mac上工作。也许命令在Mac OS X或UNIX上略有不同?
珍妮特

1
您也可以尝试ls -F | grep -v '/' | sed s/[@*]$// > filelist
Dr.Tower
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.