Às vezes, é irritante acessar um diretório com o nome da pasta. Digamos que eu tenha um diretório chamado a b c d
. Além de usar Tab, existe alguma maneira de acessar a pasta sem digitar o nome do diretório?
Eu sei que o Linux tem um identificador único para cada arquivo em particular. Posso usar isso para acessar a pasta? Não sei se isso pode realmente ser feito ou como fazê-lo.
Eu acho que quando o Linux implementa um sistema de arquivos, ele compara a exclusividade de dois nomes de diretório. Portanto, cada diretório deve ser exclusivo em um espaço. Mas acho que é como uma chave primária em um sistema de banco de dados. A chave primária é o nome do diretório ou existe algum outro identificador exclusivo (talvez alguns números armazenados "sob o capô")?
Tente pensar nisso como um processo. Se você executar o comando ps
em um terminal, ele exibirá uma lista de processos com o nome e o número de cada processo. Você precisa chamar esse processo com o número do processo. Da mesma forma, existe um número para um diretório para que você possa chamá-lo com seu número em vez de chamá-lo com seu nome?
Em uma investigação mais aprofundada, descobri que cada diretório tem um único inode
. No entanto, ainda não encontrei nenhum comando interno para acessar um diretório por ele inode
.
fonte
zsh
vez debash
cd $(icd XXXX)
--- você acabou de reescrever essafind
parte. Agora sua próxima tarefa é ... verifique o que é mais eficiente, seu programa oufind
:-P.Respostas:
Solução feita pelo OP
Nenhum comando interno encontrado aqui. Mas, finalmente, sou capaz de escrever um programa em C para usar o cd (vamos chamar meu programa icd == (inode cd)) para entrar em uma pasta usando o valor do inode. Aqui estou postando o código bruto.
Mas há um problema fundamental que enfrentei aqui. Ao codificar a execução, um código C a partir de um bash precisava criar um processo filho no processo bash (processo pai). No processo filho, o espaço no diretório é novo e não posso acessar o espaço no diretório do processo pai a partir daí. Portanto, nada poderia ser feito, exceto invocado uma nova janela do bash a partir daqui. No futuro, tentarei implementar um novo recurso de guia se as pessoas estiverem interessadas nisso. Mas acredito que tenho enfrentado muitas críticas por fazer isso. Portanto, as pessoas podem não estar interessadas. Acabei de fazer por minha diversão.
O código RAW é compartilhado aqui,
Estou usando o terminal gnome aqui. Obviamente, para outras distribuições, o código será alterado.
fonte
Qualquer entidade (na maioria) dos sistemas de arquivos no Linux possui um identificador exclusivo chamado an
inode
. Observe que um arquivo pode ter mais de um nome ( hardlink ), mas os diretórios têm apenas um link em todos os sistemas de arquivos que eu conheço. Observe que o conceito de inode é local para o sistema de arquivos, de modo que em dois dispositivos diferentes (partição ou qualquer outra coisa) a exclusividade não é garantida.Você pode ver o inode do seu diretório com
ls -ldi
:Portanto, você sabe que seu diretório possui o inode 20873234. Agora você pode alternar para ele com o comando:
(Observe que
2> /dev/null
é para fechar as mensagens de erro sobre diretórios ilegíveis ao longo do caminho.)Este comando varrerá todo o diretório inicial, portanto, seja paciente. 1 1
Mas e o uso
cd
e a conclusão da TAB do seu shell?1. Este deve ser o mais 2 coisa ineficiente que eu já postou ... uma ode à entropia. O motivo é que a “chave primária” sob a qual o acesso a um arquivo ou diretório é otimizado, rápido e direto é - adivinhem? - o caminho:
/dir/dir/file_or_dir
. Além disso, para conceder acesso a um determinado diretório, o sistema precisa verificar todas as permissões no caminho ... então, novamente, acessar por inode significa verificar recursivamente o sistema de arquivos.2. Bem, você pode piorar as coisas digitalizando a partir de
/
. 33. Mas não funcionará, porque os inodes são únicos apenas em um sistema de arquivos (por montagem).
fonte
/dir/dir/file_or_dir
. Seu programa C também precisará verificar o sistema de arquivos efind
foi otimizado nos últimos 40 anos ... ainda --- por quê? Se você precisar de um atalho, usea="/my/really/strange and long/dir path name/"
e entãocd "$a"
. Não pode vencê-lo. Ou use links simbólicos.Você pode fazer Tabgirar as pastas disponíveis em vez de listá-las. Edite o arquivo
~/.inputrc
e adicioneSe você desejar para todos os usuários, edite
/etc/inputrc
.Pressione Ctrl+ xe Ctrl+ rpara torná-lo eficaz.
Agora use
cd
Tabpara navegar para a sua pasta sem escrever o nome.cd
Shift+ Tabgirará na outra direção.Vale lembrar que
cd -
o levará para a última pasta visitada.fonte
Você pode usar curingas de shell.
Por exemplo, eu posso fazer
ou
E ele expandirá os curingas para o nome real e mudará para esse diretório. Supondo que esse seja o único diretório que corresponda.
Se você possui ambos ,
a b c d
ea1b2c3d
, entãocd a?b?c?d
, expandirá para umcd a1b2c3d a b c d
oucd a b c d a1b2c3d
(a ordem real dependerá do kernel, do sistema de arquivos ...) e o bash silenciosamente o moverá para o primeiro caminho.Por outro lado, muitas vezes você não tem pastas com nomes semelhantes, portanto, algo como
a*d
é suficiente para expandir isso sem precisar digitar todos os caracteres intermediários. Isso é especialmente útil quando você não é capaz de digitá-lo (por exemplo, os nomes estão em um script diferente ou mesmo em uma codificação diferente), e você precisaria codificar octalmente o nome do arquivo.fonte
Você pode encontrar este diretório em um gerenciador de arquivos, como o nautilus, basta arrastar e soltar no terminal.
Se você digitar o
cd
terminal anteriormente , receberá o comando.fonte
Não tenho certeza se é exatamente isso que você está pedindo, mas
zsh
tem alguns truques para acessar um diretório por outros meios além de digitar o nome estrito do diretório; por um lado, você pode digitar uma parte do nome e ela será expandida para o nome completo do diretório, o que permite coisas muito úteis, por exemplo:Bater TAB...
fonte
A maneira mais simples é clicar duas vezes no nome do diretório (supondo que esteja visível na tela), digite cd seguido de espaço e clique no botão de roda do mouse e ele copiará e colará o nome do diretório que você destacou. Pressionar a tecla Enter mudará para o diretório necessário.
Eu uso esse procedimento o tempo todo e não se limita apenas aos nomes de diretório. Pode ser usado para qualquer comando usando a linha de comando.
Boa sorte.
fonte
Se for apenas um ou alguns diretórios, por que não ter pseudônimos no bashrc ou em qualquer arquivo init? Por exemplo:
Então, sempre que você quiser entrar, basta digitar
abc
fonte
Você pode escrever um programa para criar uma tabela de hash para todos os diretórios do sistema operacional. Seria basicamente um programa de achatamento de árvores.
Mas então você poderia fazer algo parecido
hash-cd 32okjv02
e faria a pesquisa de tabela de hash para o32okjv02
mapeamento de diretório to. e pule para o seu diretório. E seria muito rápido assim que você indexasse todos os seus diretórios.Você teria que usar o mkdir para chamar esse programa a cada novo diretório e talvez escrever um comando de verificação / atualização da tabela de hash que pudesse agendar a cada minuto e no logon.
fonte