ls com caminho de diretório mostra arquivos, mas ls com padrão de arquivo não?

1

Por que isso está acontecendo?

$ sudo ls /var/lib/postgresql/9.4/pg_log/
postgresql-2015-03-23_134626.log  postgresql-2015-03-25_000000.log  postgresql-2015-03-25_095920.log
postgresql-2015-03-24_000000.log  postgresql-2015-03-25_095626.log
$ sudo ls /var/lib/postgresql/9.4/pg_log/*
ls: cannot access /var/lib/postgresql/9.4/pg_log/*: No such file or directory

ls /path/to/dir/ mostra arquivos, mas ls /path/to/dir/* diz que nenhum arquivo foi encontrado.

Por que é isso?

Richard
fonte

Respostas:

1

O curinga é expandido pelo shell antes sudo é executado. O usuário atual não pode acessar os arquivos, então a string é passada literalmente para sudo e depois ls. ls não expande curingas (é o dever do shell), por isso não pode encontrar o arquivo chamado *.

Proteja o curinga citando e chame um shell raiz para expandi-lo:

sudo sh -c 'ls /var/lib/postgresql/9.4/pg_log/*'
choroba
fonte
Incluirá o caminho com * entre aspas duplas ( sudo ls "/path/to/dir/*" ) atrasar a expansão para o tempo apropriado?
hBy2Py
@ Brian: Não. Você precisa chamar um shell para fazer a expansão do caminho.
choroba
3

Você está experimentando um aspecto do problema discutido sudo incapaz de escrever para /etc/profile e Como anexar um arquivo como sudo? , e a questão discutida em Quem lida com o * em echo *? Sua casca primária interpreta cada comando que você digita incluindo caracteres curinga (também conhecidos como globs ou padrões de nome de arquivo). Se você digitar

 some_command  * 

o shell enumera os arquivos no diretório atual e passa-os ao comando; por exemplo.,

 some_command  preto azul marrom verde laranja vermelho branco amarelo 

Bem, se você não tem permissão para ler /var/lib/postgresql/9.4/pg_log, então sua concha não tem permissão para enumerar /var/lib/postgresql/9.4/pg_log/*. O fato de que, quando o comando corre , funciona como rooté muito pouco tarde demais - a expansão do nome do caminho (ou seja, interpretação de curinga) é feita até lá.

Você pode consertar isso com um truque discutido nas duas primeiras perguntas que referi:

sudo sh -c "ls /var/lib/postgresql/9.4/pg_log/*"

Isso executa um shell privilegiado. O shell privilegiado pode expandir o *.

Scott
fonte