Pergunta

Eu sou um usuário de linha de comando pesada e usar o comando find extensivamente em meus scripts do sistema de construção. No entanto no Mac OS X quando não estou concentrando muitas vezes eu recebo uma saída como esta:

$ find -name \*.plist
find: illegal option -- n
find: illegal option -- a
find: illegal option -- m
find: illegal option -- e
find: *.plist: No such file or directory

Basicamente, eu esqueci de acrescentar o pequeno ponto:

$ find . -name \*.plist

Porque BSD find requer o caminho e GNU find não (ele assume o diretório atual, se você não especificar um). Eu uso Linux, Mac OS X e Cygwin muitas vezes tudo ao mesmo tempo, por isso é de grande benefício para mim ter todas as minhas ferramentas se comportam da mesma. Eu tentei escrever uma função find bash que acrescentou "./" se eu esquecer, mas eu falhei. Obrigado pela ajuda. :)

Foi útil?

Solução

Se você não pode disciplinar-se para usar find 'corretamente', então por que não instalar GNU find (de findutils) em um diretório em seu caminho à frente do comando find sistema.

Eu costumava ter minha própria variante particular de cp que copiar arquivos para o diretório atual, se o último item na lista não era um diretório. Eu mantive isso no meu diretório bin pessoal por muitos anos - mas eventualmente removido porque eu já não usou a funcionalidade. (Meu 'cp.sh' foi escrito em 1987 e editado duas vezes, em 1990 e 1997, como parte de mudanças para notações de sistema de controle de versão. Eu acho que eu o retirei por volta de 1998. O principal problema com o script é que cp file1 file2 é ambígua entre copiar um arquivo sobre o outro e copiar dois arquivos ao diretório atual.)

Considere escrever seu próprio wrapper para find:

#!/bin/sh
[ ! -d "$1" ] && set -- . "$@"
exec /usr/bin/find "$@"

A segunda linha diz que "se o argumento 1 não é um diretório, em seguida, ajustar os argumentos de linha de comando para incluir ponto à frente do resto do comando que vai ser confuso se você digitar:.

~/bin/find /non-existent/directory -name '*.plist' -print

porque o diretório inexistente não é um diretório eo script vai adicionar pontos para a linha de comando -. O tipo de razão que eu parei de usar meu comando privada cp

Outras dicas

Instale GNU encontrar em seu lugar.

$ brew install findutils
$ alias find=gfind

Yay, ele funciona!

Se você tem de chamá-lo de 'encontrar', então você quer:

alias find=/usr/bin/find\ .

no seu .profile ou .bash_profile ou .... Substitua o caminho real (se não / usr / bin / find) no seu Mac OSX. Digite o caminho completo para ciclos Evitar (bash normalmente iria interpretar alias find=find sem problemas, mas é melhor ter certeza).

Mas não é melhor nomear o find apelido (findl, MyFind etc), porque ele vai se tornar um hábito e problemas para você se você tentar isso em outro sistema.

find ./ -name "*.plist"

Editar : hmm, eu posso ter entendido mal a pergunta! se você fosse louco, como sobre emulando-lo através de um script shell? i rotineiramente manter scripts de utilidade aleatória em ~ / bin, e essa é a primeira coisa em meu caminho. se você tivesse uma configuração semelhante talvez você poderia fazer algo como: (! não testado)

#!/bin/sh
# remapping find!
CMD=`echo $1 | cut -c 1`
if [ $CMD = '-' ]
then
# pwd search
  /usr/bin/find ./ $*
else
# regular find
  /usr/bin/find $*
fi

Gostaria de sugerir que se você é escrever scripts (que são mais propensos a ser migrados de um sistema para outro em algum momento no futuro) que você deve tentar usar a forma mais específica do comando, que está especificando o " ". em vez de confiar em um padrão. Pela mesma razão, eu poderia até sugerir a criação de scripts sh vez de confiar em bash que não pode ser instalado em todos os lugares.

Este é provavelmente não o que você quer, mas como sobre: ??alias find="find ."

ou escolher um novo nome (findl para encontrar local?)

Você pode querer executar os comandos encontrado neste link: https://www.topbug.net/blog/2013/04/14/install-and-use-gnu-command-line-tools- in-mac-os-x /

É um pouco desatualizado, por exemplo, eu descobri que eu não tinha para adicionar muitos comandos para o meu caminho em tudo.

Isto cobre o seu problema por ter o seu uso do sistema o utilitário achado não-BSD do pacote findutils, ao mesmo tempo, instalar outras ferramentas que você pode querer também.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top