linux find命令没有扩展名的文件名未知扩展名

kut*_*lus 6 find filenames

我喜欢使用以下命令来打印文件名,但它会打印带有扩展名的文件名。

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

在我的目录中,有许多具有不同扩展名的文件。我尝试--ignore='*.*'在 before 和 after 中添加-printf,但没有用。例子; 我有文件 myfile1.txt、myfile2.mp3 等。我需要它打印 myfile1、myfile2 等。我该怎么做?

Kus*_*nda 6

如果我理解正确(我没有理解,请参阅答案的第二部分),您希望避免列出包含点字符的文件名。

这将做到这一点:

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 选项”。