*
我对bash 脚本中目录路径末尾的字符有疑问。
我有一个脚本,一旦它们足够旧,就会自动从服务器中删除一些档案。该脚本位于机器 A 上,我需要在机器 B 上运行它。我通过ssh
(无需 sudo,只需普通用户)远程访问两台机器。该脚本的规则之一是它只需要删除以dirA/dirB/dirC/dirD/dirE*
.
但是,该位置没有,dirE
所以我猜测它*
代表某个变量。这就是我想知道的,*
目录路径末尾的含义是什么以及它使脚本做什么?
答案1
这里*
是“通配符”,意思是“匹配0个或多个字符”。为了说明这一点,请考虑以下目录:
$ ls
dirA dire dirE dirEa dirEEE
$ echo dirE*
dirE dirEa dirEEE
正如您在上面看到的,globdirE*
匹配dirE
, dirEa
anddirEEE
但不匹配dirA
or dire
(*nix 系统区分大小写)。
因此,在您的脚本中,这意味着它将从名称dirA/dirB/dirC/dirD/
以dirE
.
答案2
对于那些因其他原因参加本问答的人,我将在此处添加一条注释。
如果您在( 实际上是,但有时是( 或中的内置函数) 或 of或补全的*
输出中看到文件名末尾有a ,那就完全不同了。ls
ls -F
ls
ls -F
ls-F
tcsh
zsh
tcsh
使用该-F
选项,ls
在某些内容的末尾添加一个尾随字符特别的文件名以帮助识别特殊性。zsh
并tcsh
在列出文件名完成时执行相同的操作。
如果你看到:
$ ls -F
dir/ fifo| file link@ ls* socket=
这些/
、|
、*
和=
不是文件名的一部分(尽管如果有人试图欺骗您,它们可能是文件名的一部分),但附加了 来ls
告诉您:
dir
是一个目录 (/
)fifo
是一个命名管道/fifo (|
)link
是一个符号链接 (@
)ls
是一个可执行的常规文件 (*
)(其权限中至少有一个执行位)socket
是 Unix 域套接字 (=
)
一些ls
实现(和zsh
完成)还可以通过支持不同选项的终端的颜色来进行区分。