Duas partes: encontrar um arquivo e mudar para o diretório de um arquivo encontrado.
Encontrando um arquivo
Se você tiver o nome de um arquivo que gostaria de localizar em algum lugar na hierarquia de arquivos em seu sistema, há duas maneiras que imediatamente vêm à mente:
- Use
find .
- Use
locate .
Para localizar um arquivo usando find :
$ find / -type f -name "filename" -print
Isso percorrerá todo o sistema de arquivos a partir da raiz ( / ) e imprimirá os caminhos completos de todos os arquivos regulares chamados filename . Altere / para qualquer caminho de diretório que você deseja pesquisar.
Para encontrar um arquivo usando locate :
$ locate -r -b '^filename$'
Isto irá mostrar todos os caminhos de todos os arquivos (e diretórios, etc.) cujo nome é filename . Isso geralmente é muito mais rápido do que usar find . Estou usando -r e uma expressão regular aqui para corresponder nomes de arquivos completos, caso contrário, você pode obter correspondências como file3 para uma pesquisa de file . A opção -b faz com que locate seja compatível apenas com o "nome base" dos caminhos, ou seja, o nome do arquivo real no final de cada caminho.
Para poder usar locate no Cygwin, você deve primeiro inicializar o " locate database". Você faz isso executando
$ updatedb
A desvantagem de locate é que ela só sabe sobre os locais dos arquivos presentes quando updatedb foi executado. É por isso que a maioria dos sistemas Unix com locate geralmente executa updatedb (ou o comando equivalente) usando cron (que eu acho que não está disponível no Cygwin) em intervalos regulares; uma vez por dia em alguns Linuxes, ou uma vez por semana como é o padrão no OpenBSD.
Alterando para o diretório de um arquivo encontrado
Como nenhum destes métodos tem a garantia de retornar apenas o um caminho do arquivo, é difícil criar uma maneira infalível de alterar o diretório de trabalho para o diretório do arquivo encontrado (se houver são muitos, qual escolher?).
Supondo que você gostaria de escolher o resultado primeiro :
cd "$( dirname "$(somecommand | head -n 1)" )"
Aqui somecommand é find ou locate como acima.
head -n 1 selecionará o primeiro resultado fora da lista e dirname extrairá apenas o caminho do diretório que contém o arquivo. cd alterará o diretório de trabalho para esse diretório.
Lembre-se de que, se você usar locate , as correspondências também poderão conter nomes de itens que não são arquivos comuns (por exemplo, diretórios).