在Bash中仅列出目录和子目录中的文件名。

3
我需要创建一个目录及其子目录中的文件列表。我已经使用了以下代码:
find . -type f

为了得到文件列表,但我只需要文件名,而不是路径。

所以,不要返回以下内容:

./temp2/temp3/file3.txt
./temp2/file2.txt
./file.txt

我需要返回

file3.txt
file2.txt
file.txt

感谢您的快速回复。它们都有效,所以我随机选择了最佳答案。 - TheRunner565
4个回答

5
find . -type f -exec basename {} \;

或者更好的方式是:
find . -type f -printf "%f\n"

为什么需要尾部的\; - wsdzbm
1
因为-exec后面的所有内容都被视为其参数,除非你以;结尾。 然而,也有一个-exec command +选项,它会改变-exec的行为。请查看:man find。 - Eduardo

3

您可以在gnu find中使用printf选项:

find . -type f -printf "%f\n"

对于非GNU find,使用-execdirprintf命令:
find . -type f -execdir printf "%s\n" {} +

“-execdir” 也是 GNU 的扩展功能。 - chepner
实际上,我在我的BSD(OSX)的find上有它,但是printf不在那里。 - anubhava
s/GNU// :) 这不是 POSIX。 - chepner

1
find . -type f | xargs basename

命令basename会剥离目录信息,只输出文件名。使用xargsfind的输出链接到basename的输入。

0

回答晚了 :)

-printf "%f" 是最好的解决方案,但 printf 只在 GNU find 中可用。例如,在 OS X(以及可能是 FreeBSD)上会打印:

find: -printf: unknown primary or operator

对于这种情况,我个人更喜欢以下方式

find . -type f | sed 's:.*/::'

在大型树上,与多个 basename 执行相比,它更快。

缺点是它只处理没有文件名中的 \n (换行符) 的文件。为了处理这种情况,最简单(也是最通用但较慢)的方法是使用 basename

您也可以使用 Perl,例如:

perl -MFile::Find -E 'find(sub{say if -f},".")'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接