kutlus Asked: 2019-01-24 11:21:32 +0800 CST2019-01-24 11:21:32 +0800 CST 2019-01-24 11:21:32 +0800 CST linux查找文件名的命令,没有未知扩展名的扩展名 772 我喜欢使用以下命令来打印文件名,但它使用扩展名打印它们。 find . -type f -printf '%f\n' 在我的目录中,有许多具有不同扩展名的文件。我尝试添加--ignore='*.*'before 和 after -printf,但它没有工作。例子; 我有文件 myfile1.txt、myfile2.mp3 等。我需要它打印 myfile1、myfile2 等。我该怎么做? filenames find 4 个回答 Voted Best Answer Kusalananda 2019-01-24T11:26:39+08:002019-01-24T11:26:39+08:00 如果我理解正确(我没有正确理解,请参阅答案的第二部分),您希望避免列出包含点字符的文件名。 这将做到这一点: find . -type f ! -name '*.*' 文件名通配模式*.*将匹配任何包含至少一个点的文件名。前面!否定了匹配的意义,这意味着到达末尾的路径名将是那些名称中没有点的文件。在真正古老的 shell 中,您可能想要转义!as \!(或更新您的 Unix 安装)。唯一!不会调用bash的历史扩展工具。 使用 GNU 仅打印找到的路径名的文件名部分find: find . -type f ! -name '*.*' -printf '%f\n' 使用标准find(或 GNU find): find . -type f ! -name '*.*' -exec basename {} \; 在循环中的命令替换中使用它之前,请参阅“为什么在 find 的输出上循环是不好的做法? ”。 要列出所有文件名,同时删除名称中最后一个点之后的所有内容(“删除扩展名”),您可以使用 find . -type f -exec sh -c ' for pathname do pathname=$( basename "$pathname" ) printf "%s\n" "${pathname%.*}" done' sh {} + 这会将所有找到的所有文件的路径名发送到一个简短的 shell 循环。该循环将获取每个路径名并调用basename它以提取路径名的文件名组件,然后打印结果字符串,其中包含删除最后一个点之后的所有内容。 参数扩展的${pathname%.*}意思是“从”的值的末尾删除最短的字符串匹配.*(一个文字点后跟任意文本)$pathname。它将具有删除文件名中最后一个点之后的文件名后缀的效果。 有关 的更多信息find ... -exec ... {} +,请参阅例如“了解 `find` 的 -exec 选项”。 DopeGhoti 2019-01-24T11:26:57+08:002019-01-24T11:26:57+08:00 在 Linux 中,没有文件扩展名之类的东西。文件名中的A.没有任何意义(尽管文件名中.的第一个字符 a 将其标识为隐藏文件)。 此外,在我的系统上检查手册页find显示没有--ignore选项。 也就是说,如果您想忽略.名称中带有 a 的任何文件,您可以使用find'-not运算符: find -type f -not -name '*.*' -print Stephen Harris 2019-01-24T12:07:37+08:002019-01-24T12:07:37+08:00 正如其他人指出的那样,“扩展”对 Unix 系统没有任何意义。sed但是我们可以使用一个简单的命令将它们从列表中删除。 例如 find * -type f -print | sed 's/\.[^.]*$//' 如果有目录并且您不希望它们显示在列表中,那么 find * -type f -printf "%f\n" | sed 's/\.[^.]*$//' 对于单个目录,我们可以只使用ls而不是find ls | sed 's/\.[^.]*$//' Archemar 2019-01-24T11:27:11+08:002019-01-24T11:27:11+08:00 尝试 find . -type f \! -name '*.*' -print 在哪里 \!: not (! 必须转义) name '*.*': 带扩展名的文件名
如果我理解正确(我没有正确理解,请参阅答案的第二部分),您希望避免列出包含点字符的文件名。
这将做到这一点:
文件名通配模式
*.*
将匹配任何包含至少一个点的文件名。前面!
否定了匹配的意义,这意味着到达末尾的路径名将是那些名称中没有点的文件。在真正古老的 shell 中,您可能想要转义!
as\!
(或更新您的 Unix 安装)。唯一!
不会调用bash
的历史扩展工具。使用 GNU 仅打印找到的路径名的文件名部分
find
:使用标准
find
(或 GNUfind
):在循环中的命令替换中使用它之前,请参阅“为什么在 find 的输出上循环是不好的做法? ”。
要列出所有文件名,同时删除名称中最后一个点之后的所有内容(“删除扩展名”),您可以使用
这会将所有找到的所有文件的路径名发送到一个简短的 shell 循环。该循环将获取每个路径名并调用
basename
它以提取路径名的文件名组件,然后打印结果字符串,其中包含删除最后一个点之后的所有内容。参数扩展的
${pathname%.*}
意思是“从”的值的末尾删除最短的字符串匹配.*
(一个文字点后跟任意文本)$pathname
。它将具有删除文件名中最后一个点之后的文件名后缀的效果。有关 的更多信息
find ... -exec ... {} +
,请参阅例如“了解 `find` 的 -exec 选项”。在 Linux 中,没有文件扩展名之类的东西。文件名中的A
.
没有任何意义(尽管文件名中.
的第一个字符 a 将其标识为隐藏文件)。此外,在我的系统上检查手册页
find
显示没有--ignore
选项。也就是说,如果您想忽略
.
名称中带有 a 的任何文件,您可以使用find
'-not
运算符:正如其他人指出的那样,“扩展”对 Unix 系统没有任何意义。
sed
但是我们可以使用一个简单的命令将它们从列表中删除。例如
如果有目录并且您不希望它们显示在列表中,那么
对于单个目录,我们可以只使用
ls
而不是find
尝试
在哪里
\!
: not (! 必须转义)name '*.*'
: 带扩展名的文件名