如何仅从find命令返回文件名?


14

从终端执行find命令时,我希望获取仅文件名的列表(不包含路径的其余部分)。如何在Mac上完成此操作?

Answers:



6

Evilsoup提到发布的内容不适用于间隔的文件名。因此,您可以使用:

find . -type f -print0 | while IFS= read -r -d '' filename; do echo ${filename##*/}; done

这将破坏名称中带有空格的文件(请参阅greg wiki上的ls解析
evilsoup

+1代表速度。我不知道我是否做错了什么,但是这在我的$ HOME上花了1秒,而其他所有花了大约10秒。当然,我需要10秒钟以上的时间来查找并输入。
Paulo Almeida

2

使用GNU find,您可以执行以下操作:

 find ~/tmp/ -printf "%f\n"

在OS X中也可能值得尝试。


2
-printf在OS X的BSD上不受支持find
丹尼尔·贝克

1
而且,-printf与C printf或POSIX shell实用程序关系不大printf。很少考虑将此历史功能名称用于其他用途。保守的BSD家伙可能以相同的方式看到它,因此我们可能不会-printf在BSD查找中看到该名称的克隆。
卡兹(Kaz)2013年

我不同意使用一个熟悉的函数名在不同上下文中执行相似任务的想法。为什么BSD可能永远不会支持它是另一回事。
ЯрославРахматуллин

2

有一种更好的方法来剥离除文件路径的最后一部分以外的所有内容。与awk。更好是因为awk不会对每个文件执行一次。在某些情况下,这很重要。

find ~/tmp/ -type f  | awk -F/ '{ print $NF }'

我们仅在〜/ tmp中查找文件,并获得一个列表,其中每个条目都用斜杠分隔。因此,我们使用斜杠作为字段分隔符(-F /)并打印与最后一个字段($ NF)相对应的字段参数($ 1 .. $ 9)。


这是我测试的最快的。
Paulo Almeida

我一直在使用Cygwin最近,在窗口创建过程是超贵...
ЯрославРахматуллин

2

编辑

使用sed

$ find . -type f | sed 's/.*\///'

使用xargs命令,如@nerdwaller的响应中所述

$ find . -type f -print0 | xargs --null -n1 basename

1
感谢您指出一个+1,我并没有太多使用xargs ...绝对应该,因为您从命令中删除了很多字符。
nerdwaller

当文件中有空格时,此中断。至少在快速测试中,它的工作方式如下:find . -type f -print0| xargs --null -n1 basename
Paulo Almeida

既不--null-n1期权可在OSX
瓦列里·范·

1

那这个呢:

find … | egrep -o -e '[^/]+$'

优点:仅产生一个额外的过程,而不是每个结果一个。


0

您可以sh从find的-exec选项中调用,并避免使用不必要的管道。这还有一个优点,您不必担心有趣的文件名(空格,换行符等):

find . -type f -exec sh -c 'echo "${0##*/}"' {} \;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.