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)
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 {} \;但要好得多:没有外部进程调用,所以开销更低,也没有不希望的副作用,文件名以破折号开头。
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)
如果您的文件名包含换行符,这将无法按预期工作,但这是另一个全新的故事。
小智 6
GNU 版本的 find 提供内置操作 -printf格式,允许您格式化查询的输出。
所以回答你的问题
find . -type f -printf '%f\n'
Run Code Online (Sandbox Code Playgroud)
将仅输出不带前导字符(或路径名)并带有换行符的文件名,因此每个文件名都位于其自己的行上