comando de localização não funciona: “opção ilegal - n”

3

meu comando é parecido com isto

find $PATH -name '$FILE.log' > /tmp/file-list.txt

e continuo recebendo uma mensagem de erro que diz

find: illegal option -- n

O que estou fazendo de errado aqui?

    
por Matt 07.06.2017 / 17:58

2 respostas

19

A partir dessa mensagem de erro, aposto que

  • apesar de sua tag "linux", você provavelmente não está em um sistema baseado em Linux, pois implementações de find normalmente encontradas em sistemas baseados em Linux não usam essa redação para os erros sobre opções desconhecidas
  • a variável $PATH está desativada (o que indica que o shell que você executa é provavelmente o shell Bourne ou Korn (implementação AT & T)).

Essa opção ilegal é o texto normalmente encontrado nas implementações tradicionais do Unix find .

Essas implementações tradicionais também exigem pelo menos um argumento de arquivo antes que você possa usar um predicado como -name .

Caso contrário, -name seria considerado como opções (em oposição a predicados) se fosse o próximo argumento após find .

E -n (a primeira opção em -name , que é a abreviação de -n -a -m -e ), não é uma opção find válida.

Então, muito provavelmente, a expansão de $PATH não resulta em nenhum argumento.

Isso aconteceria nos casos em que:

  1. $PATH está desativado
  2. $PATH está definido para a string vazia
  3. $PATH contém apenas espaços, tabulações ou caracteres de nova linha (o valor padrão de $IFS ).

Como $PATH é a variável especial que contém uma lista de diretórios separada por dois-pontos para procurar executáveis incluindo o comando find , podemos descartar 3 e provavelmente 2 (a menos que haja um comando find no atual diretório), ou você teria um erro find: command not found .

Quando $PATH não está definido ( 1 acima), em execvp() (como normalmente usado por env ou find % predicado -exec por exemplo) e em algumas conchas (incluindo o Korn and Shell Bourne normalmente encontrado nesses SOs tradicionais ), find seria encontrado por meio de uma pesquisa em um caminho de pesquisa padrão (shells como bash não fazem isso, mas configuram (embora não exporte) $PATH para um valor padrão quando não foi definido na inicialização).

Aqui, acho que você quer:

  • use um nome de variável diferente de $PATH para armazenar o nome do diretório (como $dir )
  • não se esqueça de citar suas variáveis
  • use ${dir:-.} se quiser usar como padrão o diretório atual se $dir estiver vazio ou não definido.
  • (talvez também investigue por que a variável $PATH está indefinida, o que é altamente incomum)

Então:

dir=some-dir
find "${dir:-.}" -name "$FILE.log"

Observe que $dir não começa com - e não é um operador find (como ! , ( , ) ) e que $FILE não contém curingas ( * , ? , [...] ) (observe o uso de aspas duplas em vez de aspas simples em torno de $FILE.log , pois suponho que você queira encontrar arquivos denominados something.log em que something é o conteúdo de $FILE em oposição aos arquivos chamados $FILE.log literalmente).

    
por 07.06.2017 / 18:44
6

$PATH é (geralmente - a menos que você tenha redefinido, mas isso quebraria um monte de coisas) uma lista separada por vírgulas de diretórios. find recebe uma lista de diretórios separados por espaços na linha de comando:

find /path/to/dir1 /path/to/dir2 -name "$FILE.log"

Note também que aspas simples inibem a avaliação de variáveis pelo shell, então você provavelmente precisa de aspas duplas em torno de $FILE.log como indicado acima.

Você pode converter $PATH em uma lista separada por espaço de várias maneiras, por exemplo:

 echo $PATH | sed 's/:/ /g'

e use a substituição de comando para colocar a lista em seu comando find:

find $(echo $PATH | sed 's/:/ /g') -name "$FILE.log"
    
por 07.06.2017 / 18:03

Tags