出于某种原因,文件名带有星号 - 它不会被更改并且内容不会被执行

use*_*970 7 bash cron centos cpanel mv

我在 Bash 中使用 CentOS 共享服务器环境。

ll "$HOME"/public_html/cron_daily/
Run Code Online (Sandbox Code Playgroud)

带来:

./
../
-rwxr-xr-x 1 user group 181 Jul 11 11:32 wp_cli.sh*
Run Code Online (Sandbox Code Playgroud)

我不知道为什么文件名最后有一个星号。我不记得添加它,当我尝试更改它时,我得到了以下输出:

[~/public_html]# mv cron_daily/wp_cli.sh* cron_daily/wp_cli.sh
+ mv cron_daily/wp_cli.sh cron_daily/wp_cli.sh
mv: `cron_daily/wp_cli.sh' and `cron_daily/wp_cli.sh' are the same file
Run Code Online (Sandbox Code Playgroud)

此错误可能表明我的 Cpanel cronjob 失败的原因:

在此处输入图片说明

更改文件或运行 Cpanel cron 命令时我做错了什么吗?因为这两个操作似乎都失败了。

jes*_*e_b 26

星号实际上不是文件名的一部分。您之所以看到它,是因为该文件是可执行的,并且您的别名ll包含以下-F标志:

-F

在作为目录的每个路径名之后立即显示一个斜杠 ('/'),​​在每个可执行文件之后显示一个星号 ('*'),在每个符号链接之后显示一个 at 符号 ('@'),一个等号 (`=' ) 在每个套接字之后,在每个 whiteout 之后都有一个百分号 ('%'),在每个是 FIFO 之后的竖线 ('|')。


正如 Kusalananda 提到的,你不能像这样使用 cron 将所有脚本放在一个目录中。随着运行的部分,你可以调用"$HOME"/public_html/cron_daily/如中提到的目录(不只是的.sh)或循环通过他们来执行所有脚本这个帖子

  • 此外,cronjob 会失败,因为您无法在这样的目录中执行所有脚本。见 https://unix.stackexchange.com/questions/454749/matching-all-files-ending-with-a-certain-extension-with-a-shell-glob-say-all-f (2认同)

nxn*_*nev 9

Jesse_b已经回答了这个问题,但我认为有必要解决一些潜在的误解。

外壳具有在某些特定条件下具有特殊含义的字符。例如:|用于管道、>重定向、\转义字符等。shell 不会按字面解释这些字符,这就是为什么当你这样做时echo foo>barfoo>bar不会被打印到你的终端,而是foo会被重定向到bar文件.

幸运的是,shell 也有一种机制可以让这些字符失去它们的特殊含义:引用。在 POSIX shell 中,有 3 种引用机制

  • 反斜杠\保留以下字符的字面值,a 除外<newline>
  • 双引号"..."保留了双引号内的所有字符的字面意义,与人物的例外`$以及\
  • 单引号'...'保留单引号内每个字符的字面值,没有例外。

所以,按照前面的例子,如果我们想按foo>bar字面打印,我们可以这样做:

  • echo foo\>bar
  • echo "foo>bar"
  • echo 'foo>bar'

星号*是那些特殊字符之一,它是模式匹配符号的一部分,用于文件名扩展。换句话说,诸如此类的命令echo *.txt将用模式匹配的文件替换模式。

在您的情况下,cron_daily/wp_cli.sh*只匹配cron_daily/wp_cli.sh,所以mv看到 2 个相同的参数并抱怨它。没关系,因为没有cron_daily/wp_cli.sh*文件。但是,如果您有一个实际cron_daily/wp_cli.sh*文件和更多可以与该模式匹配的文件,mv则会失败。

考虑以下场景:

$ ls -l
total 0
-rw-rw-r-- 1 user group 0 jul 14 12:00 file*
-rw-rw-r-- 1 user group 0 jul 14 12:00 file1
-rw-rw-r-- 1 user group 0 jul 14 12:00 file2
-rw-rw-r-- 1 user group 0 jul 14 12:00 file3
Run Code Online (Sandbox Code Playgroud)

如果我尝试在file*不使用引号的情况下重命名:

$ mv file* new_file
mv: target 'new_file' is not a directory
Run Code Online (Sandbox Code Playgroud)

那是因为这些是mv接收的参数,因此new_file预计是一个目录:

$ printf '[%s]\n' file* new_file
[file*]
[file1]
[file2]
[file3]
[new_file]
Run Code Online (Sandbox Code Playgroud)

要成功重命名file*,我需要引用该参数:

$ mv 'file*' new_file
$ ls -l
total 0
-rw-rw-r-- 1 user group 0 jul 14 12:00 file1
-rw-rw-r-- 1 user group 0 jul 14 12:00 file2
-rw-rw-r-- 1 user group 0 jul 14 12:00 file3
-rw-rw-r-- 1 user group 0 jul 14 12:00 new_file
Run Code Online (Sandbox Code Playgroud)