Quando executo este comando 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 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 find -exec
o comando?
ATUALIZAR
A razão pela qual estou tentando usar é cd
que find -exec
o nome do diretório é estranho que aparece no meu terminal como algo como ????
.
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, entãofind
falha ao executá-lo. Pelo menos o macOS e o Solaris fornecemcd
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ê poderiacd
. O diretório de trabalho em 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 sendo 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, usando esse link:Isso criaria um link simbólico chamado
thedir
que apontaria para o diretório problemático. Você pode então alterar o diretório de trabalho com(se o link existir no diretório atual). Isso evita modificar o diretório de qualquer forma. Outra ideia seria renomear o diretório de maneira semelhante a
find
, mas isso não seria aconselhável se outro programa esperasse que o diretório tivesse esse nome específico.find
executa o-exec
comando em si, não envolve um shell. Mesmo que isso acontecesse, a mudança de diretório persistiria apenas até que o shell fosse encerrado, imediatamente após o arquivocd
.Você precisará obter o nome do arquivo para o shell atual para
cd
ele. Dependendo de quão ruins são seus nomes de arquivos, você pode usar a substituição de comando:Isso não funcionará se o nome do arquivo terminar em uma nova linha, pois a substituição do comando come novas linhas à direita. Nesse caso, você precisaria proteger a nova linha e se livrar daquela
find
adição ao imprimir:Ou, com GNU
find
, não imprima a nova linha à direita (mas ainda proteja qualquer no nome do arquivo):Também usando o
-quit
predicado (também uma extensão GNU), para parar de cuidar da primeira partida como uma otimização.Alternativamente, você pode iniciar um novo shell de dentro de
find
, mas é um pouco feio:Não com exec, mas isso pode ser bom o suficiente para você:
O "-type d", só para ter certeza. Do que, eu realmente não sei.
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.Se você receber esta mensagem, sua plataforma de sistema operacional está com bugs. O padrão POSIX requer que um comando chamado
cd
esteja disponível no sistema de arquivos para que possa ser chamado viaexec()
.Agora a má notícia para você:
Mesmo que sua plataforma de sistema operacional não estivesse com bugs, você simplesmente não viu um aviso, mas não obteve os resultados esperados, pois não ajuda se um programa separado alterar seu diretório de trabalho atual e morrer imediatamente depois disso.
Se você gosta de ter um efetivo
cd
em um comando executado porfind
, você pode fazer algo como: