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

jan*_*net 25 ls

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

ls -d * > filelist
Run Code Online (Sandbox Code Playgroud)

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

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

evi*_*oup 23

基于查找的解决方案:

find . -maxdepth 1 -type f -printf '%f\n'
Run Code Online (Sandbox Code Playgroud)

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

基于 bash 的解决方案将为您提供不是目录的所有内容;它将包括命名管道之类的东西(你可能想要这个)。如果您特别想要files,请使用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
Run Code Online (Sandbox Code Playgroud)

如果您打算定期使用它,您当然可以将它放入您的某个地方的别名中~/.bashrc

alias lsfiles='for f in *; do [[ -f "$f" ]] && ls -- "$f"; done'
Run Code Online (Sandbox Code Playgroud)

由于您在评论中指出您实际上使用的是 OSX 而不是 Ubuntu,我建议您下次向Apple或更一般的Unix 和 Linux Stack Exchange 站点提出问题。


小智 10

仅列出文件名:

1. ls -p | grep -v /(不带隐藏文件)
 2. ls -l | grep ^- | tr -s ' ' | cut -d ' ' -f 9(不带隐藏文件)
  
 a) ls -pa | grep -v /(带有隐藏文件)
 b) ls -la | grep ^- | tr -s ' ' | cut -d ' ' -f(带有隐藏文件)

仅列出目录:

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

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

grep -v -e ^$ 是从结果中删除空行。

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


ken*_*orb 9

仅列出常规文件:

ls -al | grep ^-
Run Code Online (Sandbox Code Playgroud)

包括符号链接:

ls -al | grep ^[-l]
Run Code Online (Sandbox Code Playgroud)

其中列表的第一个字符描述了文件的类型,因此-意味着它是一个常规文件,因为符号链接是l.

Debian/Ubuntu

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

run-parts --list --regex . .
Run Code Online (Sandbox Code Playgroud)

使用绝对路径:

run-parts --list --regex . $PWD
Run Code Online (Sandbox Code Playgroud)

打印以/etc开头p和结尾的所有文件的名称d

run-parts --list --regex '^p.*d$' /etc
Run Code Online (Sandbox Code Playgroud)


ars*_*sra 5

另一个解决方案,一个对我有用的天真简短的解决方案:

ls -la | grep -E '^[^d]' > files
Run Code Online (Sandbox Code Playgroud)


小智 4

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

find . -type f -maxdepth 1 | sed s,^./,,
Run Code Online (Sandbox Code Playgroud)

  • `-maxdepth 1` 应该出现在任何过滤器之前,并且您可以在不使用 `sed` 和 `-printf` 选项的情况下实现此结果,即:`find 。-maxdepth 1 -type f -printf '%f\n'` (这比使用额外的程序更有效)。 (2认同)

Dr.*_*wer 3

ls -1 --file-type | grep -v '/' | sed s/@$// > filelist
Run Code Online (Sandbox Code Playgroud)

另一种可能的选择是

ls -F | grep -v '/' | sed /[@*]$// > filelist
Run Code Online (Sandbox Code Playgroud)

在文件夹末尾添加--file-type一个 /(在符号链接末尾添加一个 @。 The grep -v '/'删除子目录(因为它们现在以“/”结尾)。删除sed s/@$//@。-1 每行打印一个文件这样 grep -v 就能正常工作。