Como posso cd para um diretório sem escrever seu nome?

8

À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 o 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 ser realmente 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 único em um espaço. Mas eu 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 único (talvez alguns números armazenados “sob o capô”)?

Tente pensar nisso como um processo. Se você executar o comando ps em um terminal, ele gerará uma lista de processos com o nome e o número de cada processo. Você tem que chamar esse processo com o número do processo. Da mesma forma, existe um número para um diretório para que você possa chamar o diretório com seu número em vez de chamá-lo com seu nome?

Em investigações posteriores, descobri que cada diretório possui um inode exclusivo. No entanto, até agora não encontrei nenhum comando interno para acessar um diretório por seu inode .

    
por Maruf 08.08.2015 / 15:58

8 respostas

1

Solução feita por OP

Nenhum comando interno encontrado aqui. Mas finalmente eu sou capaz de escrever um programa em C para usar cd (vamos chamar meu programa icd == (inode cd)) para entrar em uma pasta usando o valor inode. Aqui estou postando o código bruto.

Mas há um problema fundamental que enfrentei aqui. Durante a codificação, execute um código C de um bash necessário para criar o processo filho sob o processo bash (processo pai). A partir do processo filho, o espaço de diretório é novo e não posso acessar o espaço de diretório do processo pai a partir dele. Então, nada poderia ser feito, exceto invocar uma nova janela bash a partir daqui. No futuro, tentarei implementar um novo recurso de guia se as pessoas estiverem interessadas nisso. Mas acredito que enfrentei muitas críticas por fazer isso. Então as pessoas podem não estar interessadas. Acabei de fazer pela minha diversão.

O código RAW é compartilhado aqui,

#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#include<dirent.h>
#include <unistd.h>
#include <grp.h>
#include<pwd.h>

using namespace std ;

int main(int argc , char *argv[] ) {

  struct stat ITR ;

  if( argc != 2 ) {
    printf("\nWrong Command\n\n") ;
    return 1 ;
  }

  long long given_inode = 0 ;
  for( int i =0 ; argv[1][i] ; i++ ){
    given_inode *= 10 ;
    given_inode += (argv[1][i]-'0') ;
  }

//  if (stat(argv[1], &ITR) == -1) {
//    perror("stat");
//    return 1  ;
//  }

  printf("%s\n",argv[0]) ;
    char PWD[1000] ; 
    getcwd( PWD , 1000 ) ;

  DIR *d;
  struct dirent *p;
  char path[100000] ;
  d = opendir(".");
  if( d != NULL ) {
    while( (p = readdir(d))!= NULL ) {
        strcpy( path , "./" ) ;
        strcat( path, p->d_name ) ;
        stat(path, &ITR) ;
        //printf("%s --> ",path) ;
        //printf("%ld\n",ITR.st_ino) ;
        if( ITR.st_ino == given_inode ) {
          strcpy( path , "gnome-terminal --working-directory=" ) ;
          strcat( path, PWD ) ;
                    strcat( path, "/" ) ;
                    strcat( path, p->d_name ) ;
                    system(path) ; 
                    //printf("%s\n",path) ;
                    return 0 ;
        }
    }
  }
  printf("icd %lld:No such file or directory\n",given_inode) ;
  return 0 ;

}

Estou usando o terminal do gnome aqui. Obviamente, para outra distro o código será alterado.

    
por Pilot6 11.08.2015 / 17:23
18

Qualquer entidade em (mais) sistemas de arquivos no Linux possui um identificador exclusivo chamado 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 do. Observe que o conceito de inode é local para o sistema de arquivos, de modo que, em dois dispositivos diferentes (partição ou qualquer outro), a exclusividade não é garantida.

Você pode ver o inode do seu diretório com ls -ldi :

[:~] % ls -ldi tmp/uffa                     
20873234 drwxrwxr-x 2 romano romano 4096 Jun 26  2014 tmp/uffa

Então você sabe que seu diretório tem inode 20873234. Agora você pode mudar para ele com o comando:

[:~] % cd "$(find ~ -inum 20873234 2> /dev/null)"  
[:~/tmp/uffa] %

(Observe que 2> /dev/null é para calar mensagens de erro sobre diretórios ilegíveis ao longo do caminho).

Este comando fará a varredura de todo o seu diretório pessoal, então seja paciente. 1

Mas e quanto a usar cd e a conclusão de TAB do seu shell?

1. Essa deve ser a coisa mais ineficiente 2 que já postei ... um ode à entropia. A razão é que a “chave primária” sob a qual o acesso a um arquivo ou diretório é otimizado, rápido e direto é - adivinhe? - o nome do 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 a situação digitalizando a partir de / . 3

3. Mas então não funcionará, porque os inodes são únicos somente por sistema de arquivos (por montagem).

    
por Rmano 08.08.2015 / 17:00
7

Você pode fazer com que a Tab gire as pastas disponíveis em vez de listá-las. Edite o arquivo ~/.inputrc e adicione

"\C-i": menu-complete
"\e[Z": "\e-1\C-i"

Se você quiser para todos os usuários, edite /etc/inputrc .

Pressione Ctrl + x e Ctrl + r para torná-lo efetivo.

Agora use o cd Tab para navegar até sua pasta sem escrever seu nome. cd Shift + A aba irá girar na outra direção.

Vale lembrar que cd - levará você até a última pasta visitada.

    
por Katu 09.08.2015 / 00:06
5

Você pode usar curingas de shell.

Por exemplo, eu posso fazer

cd a?b?c?d

ou

cd a\*b\*c\*d

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ê tiver os dois a b c d e a1b2c3d , então cd a?b?c?d expandirá para cd a1b2c3d a b c d ou cd a b c d a1b2c3d (a ordem real dependerá do kernel, sistema de arquivos ...) e bash fará silenciosamente mova você para o primeiro caminho.

Por outro lado, muitas vezes você não tem pastas com nomes semelhantes, então algo como a*d é suficiente para expandir isso sem ter que digitar todos os caracteres intermediários. Isso é especialmente útil quando você não consegue digitá-lo (por exemplo, os nomes estão em um script diferente ou até mesmo em uma codificação diferente) e, caso contrário, seria necessário codificar octalmente o nome do arquivo.

    
por Ángel 08.08.2015 / 23:52
3

Você pode encontrar esse diretório em um gerenciador de arquivos, por exemplo Nautilus e basta arrastar e soltá-lo no terminal.

Se você digitar anteriormente cd no terminal, você receberá o comando.

    
por Pilot6 08.08.2015 / 16:04
1

Não tenho certeza se é exatamente isso que você está pedindo, mas zsh tem alguns truques para acessar um diretório por outros meios que não digitar o nome restrito do diretório; por exemplo, 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:

Acertando a TAB ...

    
por kos 08.08.2015 / 17:53
1

A maneira mais simples é clicar duas vezes no nome do diretório (assumindo que esteja visível na tela), então digite cd seguido de espaço e clique no botão de roda do mouse para copiar e colar o nome do diretório que você possui em destaque. Pressionar a tecla enter mudará para o diretório desejado.

Eu uso este procedimento o tempo todo e não se limita apenas aos nomes dos diretórios. Pode ser usado para qualquer comando usando a linha de comando.

Boa sorte.

    
por Allen 13.08.2015 / 00:01
1

Se for apenas um ou alguns diretórios, por que não ter aliases no bashrc ou em qualquer arquivo init? Por exemplo:

alias abc='cd /tmp/"a b c"'

Então, sempre que você quiser ir lá, basta digitar abc

    
por Hopping Bunny 14.08.2015 / 03:34