Por que essa operação do sudo mv não está funcionando com o caractere curinga?

7

Acho que deve haver uma resposta simples para isso, mas não consigo entender por que isso não está funcionando!

Eu tenho uma pasta no meu diretório pessoal (bem, alguns níveis abaixo) chamada plugins instalados. Eu quero transferir todo o conteúdo dessa pasta (cerca de 15 arquivos .jar) para pastas diferentes, também chamadas de plugins instalados.

É isso que estou tentando:

$ sudo mv /home/jira-plugins/installed-plugins/* /var/atlassian/application-data/jira/plugins/installed-plugins/                                                                                                                             
mv: cannot stat '/home/jira-plugins/installed-plugins/*': No such file or directory

Qual é o meu erro?

A pasta definitivamente não está vazia. Aqui está a ls output:

$ sudo ls /home/jira-plugins/installed-plugins
analytics-client-3.15.jar                                  plugin.2223138796603023855.jira-importers-plugin-6.0.30.jar
atlassian-chaperone-2.0.3.jar                              plugin.330169947367430109.jira-fisheye-plugin-6.2.8.jar
atlassian-client-resource-1.0.jar                          plugin.4363048306537053933.jeditor-2.1.7.2.jar
atlassian-pocketknife-api-commons-plugin-0.19.jar          plugin.4438307615842123002.jira-ical-feed-1.0.4.jar
atlassian-pretty-urls-plugin-1.8.jar                       plugin.461510159947098121.jira-issue-collector-plugin-1.2.5.jar
base-hipchat-integration-plugin-7.8.24.jar                 plugin.5630909028354276764.atlassian-universal-plugin-manager-plugin-2.7.8.jar
base-hipchat-integration-plugin-api-7.8.24.jar             plugin.6920509095052318016.atlassian-bonfire-plugin-2.9.13.jar
hipchat-core-plugin-0.8.3.jar                              plugin.6952408596192442765.atlassian-bonfire-plugin-2.8.2.jar
hipchat-for-jira-plugin-1.2.11.jar                         plugin.7079751365359230322.jira-importers-bitbucket-plugin-1.0.8.jar
jira-email-processor-plugin-1.0.29.jar                     plugin.7451827330686083284.atlassian-universal-plugin-manager-plugin-2.21.4.jar
jira-fisheye-plugin-7.1.1.jar                              plugin.7498175247667964103.jira-importers-redmine-plugin-2.0.7.jar
jira-ical-feed-1.1.jar                                     plugin.7803627457720701011.jira-importers-plugin-3.5.3.jar
jira-issue-nav-components-6.2.23.jar                       plugin.7977988994984147602.jira-bamboo-plugin-5.1.6.jar
jira-servicedesk-2.3.6.jar                                 plugin.8372419067824134899.jira-importers-plugin-5.0.2.jar
jira-workinghours-plugin-1.5.5.jar                         plugin.9081077311844509190.jira-fisheye-plugin-5.0.13.jar
plugin.1260160651631713368.stp-3.0.11.jar                  plugin.9128973321151732551.jira-fisheye-plugin-6.3.10.jar
plugin.2076016305412409108.jira-fisheye-plugin-3.4.10.jar  plugin-license-storage-plugin-2.8.jar
plugin.218965759549051904.jira-importers-plugin-6.1.5.jar  querydsl-4.0.7-provider-plugin-1.1.jar
plugin.2211202876682184330.jira-ical-feed-1.0.12.jar       stp-3.5.10.jar
    
por esther h 11.09.2016 / 21:34

2 respostas

15

É quase certamente devido ao fato de que sua conta de usuário comum não pode acessar o diretório, portanto, o shell não pode enumerar os arquivos que correspondem ao caractere curinga.

Você pode confirmar isso com bastante facilidade com um comando como este

ls /home/jira-plugins/installed-plugins

Se você obtiver uma permissão negada, não haverá como o shell poder expandir um curinga * nesse diretório.

Por quê? Considere seu comando

sudo mv /home/jira-plugins/installed-plugins/* /var/atlassian/application-data/jira/plugins/installed-plugins/

A ordem de processamento é (1) expandir os curingas, (2) executar o comando, que neste caso é sudo com alguns argumentos que correspondem a uma declaração mv .

Você pode resolver o problema de duas maneiras

  1. Torne-se root e mova os arquivos

    sudo -s
    mv /home/jira-plugins/installed-plugins/* /var/atlassian/application-data/jira/plugins/installed-plugins/                    
    
  2. Expanda o curinga após executar sudo

    sudo bash -c "mv /home/jira-plugins/installed-plugins/* /var/atlassian/application-data/jira/plugins/installed-plugins/"
    
por 11.09.2016 / 22:40
10

Como você faz sudo ls para listar a pasta, suponho que um ou mais diretórios no caminho sejam ilegíveis por usuários comuns. Isso explicaria o comportamento. O principal mal-entendido aqui é quando a expansão glob do * é feita. Isso é feito pelo shell, antes de invocar qualquer comando. Se o shell não tiver permissões suficientes, ele não poderá expandi-lo.

O que acontece neste caso com mais detalhes é:

  1. Seu shell tenta expandir a linha de comando. Como você não tem o direito de ler /home/jira-plugins/installed-plugins como você mesmo, não será possível expandir o padrão de glob /home/jira-plugins/installed-plugins/* . Isso vai deixá-lo inalterado. Após este estágio, * não é mais especial.
  2. Seu shell chama o comando sudo com os argumentos mv /home/jira-plugins/installed-plugins/* e /var/atlassian/application-data/jira/plugins/installed-plugins/
  3. sudo invoca mv com os argumentos /home/jira-plugins/installed-plugins/* e /var/atlassian/application-data/jira/plugins/installed-plugins/
  4. mv tenta mover um arquivo realmente chamado /home/jira-plugins/installed-plugins/* , mas não existe e, portanto, a mensagem de erro.
por 11.09.2016 / 22:49