* no final do caminho do diretório

6

Sou muito novo no Unix, então por favor, tenha comigo um pouco. Eu tenho uma pergunta sobre o caractere * no final de um caminho de diretório em um script bash.

Eu tenho um script que deve excluir automaticamente alguns arquivos de um servidor, uma vez que eles tenham idade suficiente. O script está na máquina A e eu preciso executá-lo na máquina B. Eu acesso as duas máquinas remotamente através de ssh (sem sudo, apenas usuário regular). Uma das regras do script é que ele precisa excluir apenas os arquivos nas pastas que começam com dirA/dirB/dirC/dirD/dirE* .

No entanto, não há dirE nesse local, portanto, suponho que * represente alguma variável. Isso é o que eu gostaria de saber, o que significa * no final do caminho do diretório e o que ele faz no script?

    
por kabras 18.10.2016 / 09:24

2 respostas

9

O * aqui é um "caractere globbing" e significa "corresponde a 0 ou mais caracteres". Para ilustrar, considere este diretório:

$ ls
dirA  dire  dirE  dirEa  dirEEE
$ echo dirE*
dirE dirEa dirEEE

Como você pode ver acima, a glob dirE* corresponde a dirE , dirEa e dirEEE , mas não dirA ou dire (os sistemas * nix diferenciam maiúsculas e minúsculas).

Assim, no seu script, isso significa que ele excluirá os arquivos de qualquer diretório em dirA/dirB/dirC/dirD/ cujo nome comece com dirE .

    
por 18.10.2016 / 09:35
6

Vou apenas adicionar uma nota aqui para aqueles que chegam a este Q & A por outro motivo.

Se você vir um * no final de um nome de arquivo na saída de ls (na verdade de ls -F , mas ls é às vezes com alias para ls -F (ou ls-F incorporado em tcsh ), ou de zsh ou tcsh completions, isso é algo completamente diferente.

Com a opção -F , ls adiciona um caractere à direita no final de algum nome de arquivo especial para ajudar a identificar seu especialidade . zsh e tcsh fazem o mesmo ao listar as conclusões do nome do arquivo.

Se você ver:

$ ls -F
dir/  fifo|  file  link@  ls*  socket=

Os / , | , * e = não fazem parte do nome do arquivo (embora possam ser, se alguém tentou enganá-lo), mas são anexados por ls para informar que :

  • dir é um diretório ( / )
  • fifo é um pipe nomeado / fifo ( | )
  • link é um link simbólico ( @ )
  • ls é um arquivo regular executável ( * ) (tem pelo menos um bit de execução em suas permissões)
  • socket é um soquete de domínio Unix ( = )

Algumas ls implementações (e zsh de conclusão) também podem fazer essa diferenciação por cores para terminais que as suportam com diferentes opções.

    
por 18.10.2016 / 11:01