当前位置: 首页>>技术教程>>正文


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

问题描述

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

ls -d * > filelist

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

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

最佳方法

基于查找的解决方案:

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 的解决方案将为您提供不是目录的所有内容;它将包括命名管道之类的东西(你可能想要这个)。如果您只需要文件,请使用 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. ls -p | grep -v /                                   (without hidden files)
 2. ls -l | grep ^- | tr -s ' ' | cut -d ' ' -f 9       (without hidden files)
  
 a) ls -pa | grep -v /                                  (with hidden files)
 b) ls -la | grep ^- | tr -s ' ' | cut -d ' ' -f        (with hidden files)

仅列出目录:


 1. ls -p | grep /                                      (without hidden)
 2. ls -l | grep ^d | tr -s ' ' | cut -d ' ' -f 9       (without hidden) 

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

grep -v -e ^$ 是从结果中删除空行。更多细节:ls -p 标志是将 ‘/’ 放在目录名的末尾,-R 标志用于递归搜索,-l 用于列出信息,-a 用于列出所有(包括隐藏文件)和信息,grep -v标志用于结果反转, -e 标志用于正则表达式匹配。

第三种方法

仅列出常规文件:

ls -al | grep ^-

包括符号链接:

ls -al | grep ^[-l]

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

Debian/Ubuntu

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

run-parts --list --regex . .

使用绝对路径:

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

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

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

第四种方法

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

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

第五种方法

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

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

第六种方法

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

另一种可能的选择是

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

--file-type 在文件夹的末尾放置一个 /(但也在符号链接的末尾放置一个 @。The grep -v '/' 删除子目录(因为它们现在以 ‘/’ 结尾)。sed s/@$// 删除那个@。-1 每个打印一个文件行,以便 grep -v 正常工作。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/11971.html,未经允许,请勿转载。