Bagaimana saya bisa melakukan cd ke direktori tanpa menulis namanya?

8

Terkadang menjengkelkan mengakses direktori dengan nama folder. Katakanlah saya memiliki direktori bernama a b c d. Selain menggunakan Tab, apakah ada cara untuk mengakses folder tanpa mengetik nama direktori?

Saya tahu bahwa Linux memiliki pengidentifikasi unik setiap file tertentu. Bisakah saya menggunakan ini untuk mengakses folder? Saya tidak tahu apakah ini bisa dilakukan atau bagaimana melakukannya.

Saya pikir ketika Linux mengimplementasikan sistem file, ia membandingkan keunikan dua nama direktori. Jadi setiap direktori harus unik dalam satu spasi. Tapi saya pikir itu seperti kunci utama dalam sistem basis data. Apakah kunci utama nama direktori atau apakah ada pengidentifikasi unik lainnya (mungkin beberapa nomor disimpan "di bawah tenda")?

Coba pikirkan ini seperti sebuah proses. Jika Anda menjalankan perintah pspada terminal, itu menghasilkan daftar proses dengan nama dan nomor setiap proses. Anda harus memanggil proses itu dengan nomor proses. Demikian pula, apakah ada nomor untuk direktori sehingga Anda bisa memanggil direktori dengan nomornya alih-alih memanggilnya dengan namanya?


Pada penyelidikan lebih lanjut, saya telah menemukan bahwa setiap direktori memiliki keunikan inode. Namun, sejauh ini saya belum menemukan perintah bawaan untuk mengakses direktori inode.

Maruf
sumber
1
wildcard juga berfungsi. jika tidak instal zshalih-alihbash
Rinzwind
Ok wildcard bukan jawaban yang saya cari. perlu berpikir tentang zsh
Maruf
Anda perlu mengakses satu direktori seperti itu atau ada banyak?
Sergiy Kolodyazhnyy
Tambahkan solusi Anda (yang mungkin menarik) sebagai jawaban alih-alih menambahkannya ke pertanyaan Anda. Untuk itulah jawabannya dibuat!
kos
Buat program itu cukup cetak path dan lakukan cd $(icd XXXX)--- Anda baru menulis ulang findbagian itu. Sekarang tugas Anda berikutnya adalah ... periksa apa yang lebih efisien, program Anda atau find:-P.
Rmano

Jawaban:

2

Solusi yang dibuat oleh OP

Tidak ada perintah bawaan yang ditemukan di sini. Tapi akhirnya saya bisa menulis program C untuk menggunakan cd (sebut saja program saya icd == (inode cd)) untuk masuk dalam folder menggunakan nilai inode. Di sini saya memposting kode mentah.

Tapi ada masalah mendasar yang saya hadapi di sini. Sementara coding mengeksekusi kode C dari bash diperlukan untuk membuat proses anak di bawah proses bash (proses induk). Dari proses anak, ruang direktori baru, dan saya tidak dapat mengakses ruang direktori proses induk dari sana. Jadi tidak ada yang bisa dilakukan kecuali memanggil bash window baru dari sini. Di masa depan saya akan mencoba menerapkan fitur tab baru jika orang tertarik pada ini. Tetapi saya percaya saya telah menghadapi banyak kritik karena melakukan ini. Jadi orang mungkin tidak tertarik. Saya baru saja selesai untuk hiburan saya.

Kode RAW dibagi di sini,

#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 ;

}

Saya menggunakan terminal gnome di sini. Tentunya untuk distro lain kodenya akan berubah.

Pilot6
sumber
1
Jika Anda bisa pindah ke direktori dalam skrip shell, Anda dapat sumber skrip untuk mencapai apa yang Anda inginkan. Definisikan alias untuk mempersingkat perintah.
daltonfury42
19

Entitas apa pun di (kebanyakan) sistem file di Linux memiliki pengidentifikasi unik yang disebut inode. Perhatikan bahwa sebuah file dapat memiliki lebih dari satu nama ( hardlink ), tetapi direktori hanya memiliki satu tautan di semua sistem file yang saya ketahui. Perhatikan bahwa konsep inode bersifat lokal untuk sistem file, sehingga dalam dua perangkat yang berbeda (partisi atau apa pun) keunikannya tidak dijamin.

Anda dapat melihat inode direktori Anda dengan ls -ldi:

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

Jadi Anda tahu bahwa direktori Anda memiliki inode 20873234. Sekarang Anda dapat beralih ke sana dengan perintah:

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

(Perhatikan bahwa 2> /dev/nullini adalah untuk menutup pesan kesalahan tentang direktori yang tidak dapat dibaca di sepanjang jalur.)

Perintah ini akan memindai keseluruhan direktori home Anda, jadi bersabarlah. 1

Tapi bagaimana dengan menggunakan cddan menyelesaikan TAB dari shell Anda?


1. Ini pasti 2 halpalingtidak efisien yang pernah saya posting ... sebuah ode untuk entropi. Alasannya adalah bahwa "kunci utama" di mana akses ke file atau direktori dioptimalkan, cepat dan langsung - coba tebak? - pathname:/dir/dir/file_or_dir. Selain itu, untuk memberi Anda akses ke direktori yang diberikan, sistem perlu memeriksa semua izin di jalur ... jadi sekali lagi, mengakses dengan inode berarti memindai secara rekursif sistem file.

2. Nah, Anda dapat memperburuk keadaan dengan memindai dari/. 3

3. Tetapi kemudian itu tidak akan berfungsi, karena inode hanya unik pada basis per-filesystem (per-mount).

Rmano
sumber
Terima kasih @Romano. Sebenarnya saya sedang memikirkan masalahnya. Saya tidak tahu bahwa masalahnya akan berubah menjadi solusi yang tidak efisien. Tetapi pikirkan solusinya. Anda dapat dengan mudah menulis program ac dan memasukkannya ke / bin dan kemudian coba jalankan dengan satu-satunya nomor inode. Saya akan memposting kode jika saya bisa menulis pemikiran seperti itu.
Maruf
1
dan juga satu pikir saya perlu tahu. Saya mengerti bagian pertama dari perintah ini. "$ (temukan ~ -inum 20873234 ******)". tapi saya tidak tahu Kenapa kamu menulis ini, "2> / dev / null". Bisakah Anda menjelaskan sekali lagi.
Maruf
4
@ Marsuf, itu tidak akan berhasil, efisiensi-bijaksana. The "primary key" di mana akses ke file atau direktori dioptimalkan, cepat dan langsung, coba tebak, pathname ... /dir/dir/file_or_dir. Program C Anda perlu memindai sistem file juga, dan findtelah dioptimalkan selama 40 tahun terakhir ... masih --- mengapa? Jika Anda memerlukan jalan pintas, gunakan a="/my/really/strange and long/dir path name/"lalu cd "$a". Tidak bisa mengalahkannya Atau gunakan symlinks.
Rmano
1
Yang bagus +1. Saya berada di ujung menulis sesuatu yang serupa, tetapi saya terlalu malas, karena tugas itu tidak masuk akal sama sekali. @Rmano
Pilot6
3
@Rmano Saya akan menambahkan bahwa secara umum, bahkan pada sistem file tunggal, mungkin ada beberapa file yang memiliki inode yang sama, yaitu, hardlink. Karena kita berbicara tentang direktori di sini, kebetulan bahwa setiap direktori memiliki inode yang unik (direktori tidak dapat di-hardlink.) traversal, diperlukan untuk menentukan apakah pengguna diizinkan untuk mengakses sumber daya yang sesuai. (Jadi jika suatu direktori dapat diakses oleh inode-nya, maka kernel harus menentukan jalurnya.)
Malte Skoruppa
8

Anda dapat Tabmemutar folder yang tersedia alih-alih mencantumkannya. Edit file ~/.inputrcdan tambahkan

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

Jika Anda menginginkannya untuk semua pengguna, edit /etc/inputrcsaja.

Tekan Ctrl+ xdan Ctrl+ runtuk membuatnya efektif.

Sekarang gunakan cdTabuntuk menavigasi ke folder Anda tanpa menulis namanya. cdShift+ Tabakan berputar ke arah lain.

Layak diingat bahwa cd -akan membawa Anda ke folder yang terakhir dikunjungi.

Katu
sumber
Ini jawaban yang bagus. Bisakah Anda membuatnya ditampilkan sekali dan kemudian memutar?
daltonfury42
1
Anda dapat menetapkan ini pada pintasan lain. Saya menggunakan Eclipse dan saya terbiasa dengan Ctrl + space untuk pelengkapan otomatis jadi saya menggunakan "\ C-": menu-complete sebagai gantinya, meninggalkan tab apa adanya.
Katu
5

Anda dapat menggunakan shell wildcard.

Misalnya, saya bisa melakukannya

cd a?b?c?d

atau

cd a\*b\*c\*d

Dan itu akan memperluas wildcard ke nama sebenarnya dan mengubah ke direktori itu. Anggap itu satu-satunya direktori yang cocok.

Jika Anda memiliki keduanya a b c ddan a1b2c3d, kemudian cd a?b?c?dakan berkembang ke salah satu cd a1b2c3d a b c datau cd a b c d a1b2c3d(urutan aktual akan tergantung pada kernel, sistem file ...), dan bash akan diam-diam memindahkan Anda ke jalur pertama.

Di sisi lain, Anda sering tidak memiliki folder dengan nama yang sama, jadi sesuatu seperti itu a*dsudah cukup untuk mengembangkannya tanpa harus mengetikkan semua karakter perantara. Ini sangat berguna ketika Anda tidak benar-benar dapat mengetiknya (mis. Nama-nama tersebut dalam skrip yang berbeda, atau bahkan penyandian yang berbeda), dan Anda mungkin perlu mengkode kode nama file.

Malaikat
sumber
3

Anda dapat menemukan direktori ini di file manager, mis. Nautilus dan cukup drag dan drop ke terminal.

Jika sebelumnya Anda mengetik cdterminal, Anda akan mendapatkan perintah.

Pilot6
sumber
Sebenarnya saya mencoba melakukan semuanya dari terminal. :) Jadi tidak perlu memikirkan nautilus. Saya pikir harus ada prosedur untuk mengakses file. Seperti Linux selalu menyimpan pengidentifikasi unik untuk file tertentu. Tetapi saya tidak tahu bagaimana melakukan itu atau apakah ini bisa dilakukan.
Maruf
Tidak jelas apa yang Anda minta. Tidak mungkin mengubah ke direktori yang tidak memasukkan namanya.
Pilot6
Lihat pernyataannya. Saya telah memperbaruinya.
Maruf
Atau jika ini adalah masalah dengan satu file, Anda bisa menambahkan alias.
daltonfury42
1

Tidak yakin apakah itu yang Anda inginkan, tetapi zshmemiliki beberapa trik rapi untuk mengakses direktori dengan cara lain selain mengetikkan nama ketat direktori; untuk satu, Anda dapat mengetik bagian dari nama dan itu akan meluas ke nama lengkap direktori, yang memungkinkan untuk hal-hal yang sangat berguna, misalnya:

masukkan deskripsi gambar di sini

Memukul TAB...

masukkan deskripsi gambar di sini

kos
sumber
1

Cara paling sederhana adalah dengan mengklik dua kali pada nama direktori (dengan asumsi itu terlihat di layar), lalu ketik cd diikuti dengan spasi dan klik tombol roda pada mouse Anda dan itu akan menyalin dan menempelkan nama direktori yang telah Anda sorot. Menekan tombol enter kemudian akan berubah ke direktori yang diperlukan.

Saya menggunakan prosedur ini sepanjang waktu dan tidak hanya terbatas pada nama direktori. Itu dapat digunakan untuk perintah apa saja menggunakan baris perintah.

Semoga berhasil.

Allen
sumber
Ini tidak akan luput dari karakter khusus
Scz
1

Jika hanya satu atau beberapa direktori, mengapa tidak ada alias di bashrc Anda atau file init apa pun? Sebagai contoh:

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

Lalu kapan pun Anda ingin masuk ke sana, ketikkan saja abc

Melompat Kelinci
sumber
0

Anda bisa menulis program untuk membuat tabel hash untuk semua direktori OS Anda. Ini pada dasarnya akan menjadi program perataan pohon.

Tapi kemudian Anda bisa melakukan sesuatu seperti hash-cd 32okjv02dan itu akan melakukan pencarian tabel hash untuk 32okjv02pemetaan direktori. dan lompat ke direktori Anda. Dan itu akan sangat cepat setelah Anda mendapatkan semua direktori Anda diindeks.

Anda harus alias mkdir untuk memanggil program ini setiap direktori baru dan mungkin menulis perintah check / refresh hash-table yang dapat Anda cron setiap menit dan saat masuk.

mutant_city
sumber