Procura por um arquivo específico e muda para seu diretório

4

Qual é a melhor maneira de acessar um diretório que contenha um arquivo específico? (Assumindo que estamos começando na raiz de onde queremos pesquisar). Eu estou usando o Cygwin.

SOLUÇÃO: Minha solução final foi colocar isso no meu arquivo .bashrc.

jump2_func() {
cd "$(find . -name $1 -printf %h -quit 2>/dev/null)"
}

alias jump2=jump2_func
    
por Dale 26.08.2017 / 19:29

2 respostas

1
cd "$(find . -name filename -printf %h -quit 2>/dev/null)"

Se nenhum arquivo com esse nome for encontrado, o cd será alterado para o diretório inicial. Se isso não é desejado, então você precisa de algo assim:

dir="$(find . -name filename -printf %h -quit 2>/dev/null)"
test -d "$dir" && cd "$dir"
    
por 28.08.2017 / 12:45
6

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:

  1. Use find .
  2. 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).

    
por 26.08.2017 / 20:16