我想创建一个目录中所有文件的列表,不列出位于同一目录下的任何子目录,并将该列表打印到新文件中。
ls -d * > filelist
将创建当前目录中所有文件的列表,但它也会列出当前目录中的子目录。我尝试find
使用该-maxdepth 1
选项的命令 - 但是,输出格式有问题,因为 find 还会打印出路径和文件名。
如果有人可以告诉我也许可以使用另一个命令或选项来生成仅包含目录中文件的输出列表而不是子目录的名称或其内容,我将不胜感激。
答案1
基于查找的解决方案:
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,我建议你下次直接向苹果或者更一般的Unix 和 LinuxStack Exchange 网站。
答案2
仅列出文件名:
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 标志表示正则表达式匹配。
答案3
仅列出常规文件:
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
答案4
我建议使用 find 并在必要时从输出中删除目录名称:
find . -type f -maxdepth 1 | sed s,^./,,