O shell tenta a expansão do padrão glob antes de passar o resultado expandido para cp
(na verdade, ele está passando o resultado para sudo
, que então passa inalterado para cp
). Como o shell (ele está rodando como você, e não como root) não é capaz de atravessar o diretório, cp
acaba recebendo o padrão unexpanded em sua lista de argumentos.
cp
não executa nenhuma expansão glob. Espera uma lista de nomes de arquivos. A string com o padrão não nomeia um arquivo.
Talvez a maneira mais direta de executar a tarefa seja invocar seu comando em um sub-shell. Cite o comando com aspas duplas ( "
) ou aspas simples ( '
).
sudo sh -c "cp /data/*20150522* /backup/"
sudo sh -c 'cp /data/*20150522* /backup/'
Isso funciona porque o sub-shell expande o padrão glob na string de comando antes de invocar o comando. Como o sub-shell está sendo executado como root em sudo
, a expansão é bem-sucedida.
Usar aspas duplas para citar o comando para o sub-shell permite que o shell pai expanda as variáveis do shell antes de chamar o comando sudo
. Se você quiser que as variáveis sejam expandidas pelo sub-shell, as aspas simples devem ser usadas no lugar. Neste caso, é equivalente, desde que você não tenha nenhuma variável. Mas você pode adicionar um para ver a diferença de comportamento.
sudo sh -c "echo $USER; cp /data/*20150522* /backup/"
sudo sh -c 'echo $USER; cp /data/*20150522* /backup/'
O primeiro comando exibirá seu nome de usuário, enquanto o segundo comando exibirá o nome de usuário root.