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).