与 -exec echo {} 选项一起使用时,从 find 命令输出中删除前导点

Dip*_*mat 13 find

find . -type f -exec  echo {} \;
Run Code Online (Sandbox Code Playgroud)

使用上面的命令,我想获取没有前导“./”字符的文件名。所以基本上,我想得到:

filename
Run Code Online (Sandbox Code Playgroud)

代替:

./filename
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?

小智 20

使用*代替,.前导./消失。

find * -type f
Run Code Online (Sandbox Code Playgroud)

  • @Hannes不要使用`.*`而是`.[^.]* *`,否则find将探索`..`请参阅我的答案以获取完整的命令。顺便说一句,令人非常沮丧的是,这个答案只重复了我三年前发布的命令之一,尽管这个答案不完整(隐藏文件被省略),而且尽管我警告过这样的构造,但它的票数却比我的多两倍应该避免。想想看……显然,人们更喜欢简短的答案,即使这样的答案在某些情况下会失败。 (8认同)
  • 这很整洁。值得一提的是,`*` 被 shell 扩展为所有文件的列表,然后传递给 `find`。根据 shell 及其设置,该列表可能包含也可能不包含名称以点开头的文件。如果给定`.`,这可能与`find` 所做的不同。对于 bash,您可以使用 `find * .* -type f` 来列出所有文件。 (3认同)
  • 这样我就得到了 shellcheck 问题 [SC2012](https://github.com/koalaman/shellcheck/wiki/SC2012) - 想象一下其中一个文件名为“-name”。 (2认同)

xhi*_*nne 14

假设您不想要单独的文件名,也不需要前导的完整相对路径./,如果您有 GNU,find您可以尝试以下操作:

find . -type f -printf '%P\n'
Run Code Online (Sandbox Code Playgroud)

否则,您可以尝试以下方法之一:

find . -type f -print | cut -d/ -f2-

find .[^.]* * -type f -print
Run Code Online (Sandbox Code Playgroud)

您应该避免使用最后一个(如果您的目录中有很多条目,请考虑过长的命令行)。

-print和你做同样的事情,-exec echo {} \;但要好得多:没有外部进程调用,所以开销更低,也没有不希望的副作用,文件名以破折号开头。


Gow*_*ham 7

find . -type f -exec echo {} \;

的默认操作find是打印结果。如果没有明确告知,find默认为搜索当前目录。您的命令可以简化为find -type f.

为什么/什么时候这很重要?只有当您在足够大的目录上运行此命令时,您才会开始看到性能差异。-exec echo {} \;将使您的计算机不必要地更多地工作,因为它必须启动一个外部进程,例如/bin/echo打印文件名。每个由find.

要回答有关删除的问题./,更有效的方法是使用cut. 您知道前两个字符总是./. cut -c3-只会保留位置 3 及以后的字符。

> cd /etc/fonts/conf.d
> find -type f | cut -c3-
99pdftoopvp.conf
00kde.conf
65-khmer.conf
README
Run Code Online (Sandbox Code Playgroud)

如果您的文件名包含换行符,这将无法按预期工作,但这是另一个全新的故事。

  • 省略指定搜索路径的形式(“find -type f”)当前不是 POSIX 兼容行为。对于不是 GNU find 的 find(1) 变体,此操作会失败。 (3认同)
  • `cut` 剪切每一行,但没有什么可以阻止文件路径包含换行符。 (2认同)

小智 6

GNU 版本的 find 提供内置操作 -printf格式,允许您格式化查询的输出。

所以回答你的问题

find . -type f -printf '%f\n'
Run Code Online (Sandbox Code Playgroud)

将仅输出不带前导字符(或路径名)并带有换行符的文件名,因此每个文件名都位于其自己的行上

  • @grenix 尝试:`查找 . -type f -printf '%P\n'` (2认同)