我喜欢使用以下命令来打印文件名,但它会打印带有扩展名的文件名。
find . -type f -printf '%f\n'
Run Code Online (Sandbox Code Playgroud)
在我的目录中,有许多具有不同扩展名的文件。我尝试--ignore='*.*'在 before 和 after 中添加-printf,但没有用。例子; 我有文件 myfile1.txt、myfile2.mp3 等。我需要它打印 myfile1、myfile2 等。我该怎么做?
如果我理解正确(我没有理解,请参阅答案的第二部分),您希望避免列出包含点字符的文件名。
这将做到这一点:
find . -type f ! -name '*.*'
Run Code Online (Sandbox Code Playgroud)
文件名通配模式*.*将匹配任何包含至少一个点的文件名。前面!否定了匹配的意义,这意味着到达最后的路径名将是名称中没有点的文件的路径名。在真正古老的shell 中,您可能想要转义!as \!(或更新您的 Unix 安装)。唯一!不会调用bash的历史扩展工具。
使用 GNU 仅打印找到的路径名的文件名部分find:
find . -type f ! -name '*.*' -printf '%f\n'
Run Code Online (Sandbox Code Playgroud)
使用标准find(或 GNU find):
find . -type f ! -name '*.*' -exec basename {} \;
Run Code Online (Sandbox Code Playgroud)
在循环中的命令替换中使用它之前,请参阅“为什么在 find 的输出上循环是不好的做法? ”。
要列出所有文件名,同时删除名称中最后一个点之后的所有内容(“删除扩展名”),您可以使用
find . -type f -exec sh -c '
for pathname do
pathname=$( basename "$pathname" )
printf "%s\n" "${pathname%.*}"
done' sh {} +
Run Code Online (Sandbox Code Playgroud)
这会将所有找到的所有文件的路径名发送到一个短的 shell 循环。循环将获取每个路径名并调用basename它来提取路径名的文件名部分,然后打印结果字符串,其中删除最后一个点之后的所有内容。
参数扩展的${pathname%.*}意思是“.*从”的值的末尾删除最短的字符串匹配(文字点后跟任意文本)$pathname。它将具有删除文件名中最后一个点之后的文件名后缀的效果。
有关更多信息find ... -exec ... {} +,请参见例如“了解 `find` 的 -exec 选项”。
| 归档时间: |
|
| 查看次数: |
6255 次 |
| 最近记录: |