Quando executo este comando, ele funciona:
$ find . -inum 888696 -exec ls '{}' \;
Conversation.pst Outlook Data File Outlook Data File.sbd Trash Unsent Messages
Inbox.pst Outlook Data File.msf Sent.pst Trash.msf Unsent Messages.msf
No entanto, ao substituir ls
por cd
ele não funciona:
$ find . -inum 888696 -exec cd '{}' \;
find: ‘cd’: No such file or directory
Eu sei que cd
é um bash
built-in, então eu tentei isso que também não funciona:
$ find . -inum 888696 -exec builtin cd '{}' \;
find: ‘builtin’: No such file or directory
Como posso usar cd
junto com o find -exec
comando?
ATUALIZAR
A razão que eu estou tentando usar cd
com find -exec
é que o nome do diretório é um estranho que aparece no meu terminal como algo parecido ????
.
bash
find
cd-command
user3405291
fonte
fonte
LC_ALL=C printf '%q\n' *
imprimir nomes ASCII para todos os arquivos em seu diretório atual, um para uma linha (alterando novas linhas para$'\n'
ou similares).Respostas:
A
-exec
opção defind
executar um utilitário externo, possivelmente com alguma opção de linha de comando e outros argumentos.Seu Unix não fornece
cd
como um utilitário externo, apenas como um shell embutido, portanto,find
falha ao executá-lo. Pelo menos MacOS e Solaris que fornecemcd
como um utilitário externo.Haveria pouco ou nenhum uso para executar
cd
dessa maneira, exceto como uma maneira de testar se o nome do caminho encontrado porfind
é um diretório no qual você seria capazcd
. O diretório de trabalho no seu shell interativo (ou o que estiver chamandofind
) não mudaria de qualquer maneira.Relacionado:
Se você está tendo problemas com o nome de um diretório que é estranho ou extremamente difícil de digitar e deseja mudar para esse diretório, considere criar um link simbólico para o diretório e,
cd
em seguida , usar esse link:Isso criaria um link simbólico chamado
thedir
que apontaria para o diretório problemático. Você pode alterar o diretório de trabalho com(se o link existir no diretório atual). Isso evita modificar o diretório de qualquer maneira. Outra idéia seria renomear o diretório de maneira semelhante
find
, mas isso não seria aconselhável se outro programa esperasse que o diretório tivesse esse nome específico.fonte
cd
comfind -exec
é que os nomes de diretório são, em alguns caracteres estranhos que não aparecem corretamente em meu terminal.cd
entrar em um diretório que tem um nome ruim e não consigocd
nele normalmente./bin/cd
é resultado do POSIX ( pubs.opengroup.org/onlinepubs/9699919799/utilities/… ), onde os componentes internos normais precisam estar acessíveis para exec (). Claro,/bin/cd
provavelmente não faz o que as pessoas querem :-)find
executa o-exec
próprio comando, não envolve um shell. Mesmo que isso acontecesse, a alteração do diretório só persistiria até a saída do shell, imediatamente após ocd
.Você precisará colocar o nome do arquivo no shell atual
cd
. Dependendo de quão ruins são os seus nomes de arquivos, você pode usar a substituição de comandos:Isso não funcionará se o nome do arquivo terminar em uma nova linha, pois a substituição de comando come novas linhas à direita. Nesse caso, você precisará proteger a nova linha e se livrar da que
find
adiciona ao imprimir:Ou, com o GNU
find
, ele não imprime a nova linha à direita (mas ainda protege alguma no nome do arquivo):Também usando o
-quit
predicado (também uma extensão GNU), para parar de cuidar da primeira correspondência como uma otimização.Como alternativa, você pode iniciar um novo shell a partir de dentro
find
, mas é um pouco feio:fonte
find
adiciona ao imprimir. Editado.dir=$(find -print0)
ainda irá lixo do final de linha do nome do arquivo ...Não com o exec, mas isso pode ser bom o suficiente para você:
O "-type d", apenas para ter certeza. Do que eu realmente não sei.
fonte
mkdir $'foo\n'
funciona perfeitamente aqui; Ainda não vi um sistema de arquivos UNIX nativo em que não era suportado.Use um fluxo delimitado por NUL para ler a saída
find
que funciona em todos os casos - incluindo nomes que terminam em novas linhas. Além disso, você pode usarprintf '%q'
para gerar uma representação legível de um nome de arquivo.fonte
Se você receber essa mensagem, sua plataforma do sistema operacional estará com erros. O padrão POSIX requer que um comando nomeado
cd
esteja disponível no sistema de arquivos para que possa ser chamado viaexec()
.Agora as más notícias para você:
Mesmo que sua plataforma do sistema operacional não tenha problemas, você simplesmente não viu um aviso, mas não obteve os resultados esperados, pois não ajuda se um programa separado altera seu diretório de trabalho atual e morre imediatamente depois disso.
Se você deseja que
cd
um comando efetivo seja executado porfind
, você pode fazer algo como:fonte
sh
, não algo que você gostaria de fazer. É melhor evitar valores fictícios para esse script embutido,$0
como é usado em mensagens de erro, por exemplo (como quando issocd
falharia).cd "$1"
? Se o nome é difícil de digitar, ele pode muito bem também conter metacaracteres shell ...