假设当前目录中有文件 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 "*.*"
你还可以拥有.file
UNIX 下的文件,如果你想匹配那些 和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