我喜欢使用以下命令来打印文件名,但它会打印带有扩展名的文件名。
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 选项”。