我喜欢使用以下命令来打印文件名,但它会打印带有扩展名的文件名。
find . -type f -printf '%f\n'
在我的目录中,有许多具有不同扩展名的文件。我尝试添加--ignore='*.*'
before 和 after -printf
,但没有成功。例子;我有文件 myfile1.txt、myfile2.mp3 等。我需要它打印 myfile1、myfile2 等。我该怎么做?
答案1
如果我理解正确的话(我没有,请参阅答案的第二部分),您希望避免列出包含点字符的文件名。
这将做到这一点:
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 . -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 选项”。
答案2
在 Linux 中,不存在文件扩展名之类的东西。文件名中的A.
没有任何意义(尽管 a.
作为第一的文件名中的字符将其标识为隐藏文件)。
另外,检查我的系统上的手册页find
没有显示--ignore
任何选项。
也就是说,如果您想忽略.
名称中带有 a 的任何文件,可以使用find
's-not
运算符:
find -type f -not -name '*.*' -print
答案3
正如其他人所指出的,“扩展”对于 Unix 系统来说没有任何意义。但我们可以使用一个简单的命令将它们从列表中删除sed
。
例如
find * -type f -print | sed 's/\.[^.]*$//'
如果有目录并且您不希望它们显示在列表中,那么
find * -type f -printf "%f\n" | sed 's/\.[^.]*$//'
对于单个目录,我们可以使用ls
而不是find
ls | sed 's/\.[^.]*$//'
答案4
尝试
find . -type f \! -name '*.*' -print
在哪里
\!
: 不是(!必须转义)name '*.*'
: 带扩展名的文件名