Jesse_b já respondeu à pergunta, mas acho que vale a pena abordar alguns possíveis equívocos.
O shell tem caracteres que possuem um significado especial sob algumas condições específicas. Por exemplo: |
é usado em pipelines, >
em redirecionamentos, \
para caracteres de escape, etc. Esses caracteres não são interpretados literalmente pelo shell, e é por isso que quando você faz echo foo>bar
, foo>bar
won não será impresso no seu terminal, mas foo
será redirecionado para o arquivo bar
.
Felizmente, o shell também possui um mecanismo que faz com que esses caracteres percam seu significado especial: citando. Em shells POSIX, existem 3 mecanismos de cotação :
-
Barra invertida
\
: preserva o valor literal do caractere seguinte, com exceção de <newline>
.
-
As aspas duplas
"..."
: preservam o valor literal de todos os caracteres entre aspas duplas, com exceção dos caracteres '
, $
e \
.
-
As aspas simples
'...'
: preservam o valor literal de cada caractere entre aspas simples, sem exceções.
Então, seguindo o exemplo anterior, se quiséssemos imprimir foo>bar
literalmente, poderíamos ter feito:
-
echo foo\>bar
-
echo "foo>bar"
-
echo 'foo>bar'
O asterisco *
é um desses caracteres especiais, faz parte da correspondência de padrões notação e é usada para expansão de nome de arquivo . Em outras palavras, comandos como echo *.txt
substituirão o padrão pelos arquivos que o padrão corresponde.
No seu caso, cron_daily/wp_cli.sh*
corresponde apenas a cron_daily/wp_cli.sh
, por isso mv
vê dois argumentos idênticos e reclama. Tudo bem, porque não há arquivo cron_daily/wp_cli.sh*
. Mas se você tivesse um arquivo cron_daily/wp_cli.sh*
real e mais arquivos que pudessem ser correspondidos pelo padrão, mv
teria falhas.
Considere o seguinte cenário:
$ 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
Se eu tentar renomear file*
sem usar aspas:
$ mv file* new_file
mv: target 'new_file' is not a directory
Isso porque esses são os argumentos que mv
recebe, portanto new_file
deve ser um diretório:
$ printf '[%s]\n' file* new_file
[file*]
[file1]
[file2]
[file3]
[new_file]
Para renomear com sucesso file*
, preciso citar esse argumento:
$ 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