2016-03-14 54 views
0

我需要在目录及其所有子目录中创建文件列表。我已经使用仅列出bash中的目录和子目录中的文件名

find . -type f 

获取文件列表,但我只需要文件名,而不是导致它的路径。

因此,而不是返回此:

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

我需要返回

file3.txt 
file2.txt 
file.txt 
+0

感谢您的快速反应。他们都工作,所以我随机选择了最好的答案。 – TheRunner565

回答

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

或更好:

find . -type f -printf "%f\n" 
1
find . -type f | xargs basename 

命令basename条的目录和仅输出文件名。使用xargs链接find的输出作为basename的输入。

1

您可以使用printf选项在GNU find

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

对于非GNU find使用-execdirprintf

find . -type f -execdir printf "%s\n" {} + 
+0

'-execdir'也是一个GNU扩展。 – chepner

+0

其实我在我的BSD(OSX)'find'上找到它,但'printf'不存在 – anubhava

+0

's/GNU //':)不过它不是POSIX。 – chepner

0

最后回答:)

-printf "%f"是最好的解决方案,但printf只在GNU查找中可用。例如在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},".")' 
相关问题