如何在 bash 脚本中选择没有扩展名的文件?

如何在 bash 脚本中选择没有扩展名的文件?

假设当前目录中有文件 xinitrc、alphabetsoup、ieat.pie。需要一个 bash 脚本来仅选择 xinitrc 和 Alphabetsoup。

答案1

bash 扩展 glob+([^.])将匹配.名称中没有任何内容的文件。它要求您尚未取消设置shopt extglob(在现代 bash 安装中,应默认设置)。该模式的含义是:

任何数量(但至少一个)的字符,除了.

您可以将所有文件名放入一个数组中:

NO_EXTENSION=( +([^.]) )

您可以打印文件名:

printf "%s\n" +([^.])

或者将它们全部传递给实用程序:

ls -- +([^.])

如果您希望它们位于变量而不是数组中,则需要非常确定文件名称中没有空格。如果您绝对确定这一点,您可以这样做:

NO_EXTENSION=$(echo +([^.]))

与数组情况不同,为了实现路径名扩展,需要调用 echo。我强烈建议对此类列表使用数组,因为您不必担心文件名中的特殊字符。

答案2

您可以使用以下命令获取工作目录中名称中不带句号的文件列表:

find . -maxdepth 1 ! -name "*.*"

你还可以拥有.fileUNIX 下的文件,如果你想匹配那些 和file,但不是file.ext那么你可以使用:

find . -maxdepth 1 ! -name "*.*" -o -name ".*[^.]*"

答案3

随着extglob选项,可以匹配模式的补集,即名称与模式不匹配的文件。具有扩展名的文件是匹配的文件*.*,因此当前目录中没有扩展名的文件可以这样匹配:

shopt -s extglob
somecommand !(*.*)

.请注意,不会包含点文件(名称以 开头的文件)。如果您也想匹配它们并将它们视为无扩展,除非它们包含第二个.,您可以使用

shopt -s extglob nullglob
somecommand !(*.*) .!(*.*)

或者

shopt -s dotglob extglob
somecommand !(?*.*)

答案4

也许您正在寻找这个:

$ ls | grep -v '\.'

例子:

$ ls
alphabetsoup  ieat.pie  xinitrc
$ ls | grep -v '\.'
alphabetsoup
xinitrc

相关内容