ฉันจะซีดีไปยังไดเรกทอรีโดยไม่ต้องเขียนชื่อได้อย่างไร


8

บางครั้งมันน่ารำคาญในการเข้าถึงไดเรกทอรีด้วยชื่อโฟลเดอร์ a b c dว่าฉันมีไดเรกทอรีชื่อ นอกเหนือจากการใช้Tabแล้วมีวิธีการเข้าถึงโฟลเดอร์โดยไม่ต้องพิมพ์ชื่อของไดเรกทอรีหรือไม่?

ฉันรู้ว่า Linux มีตัวระบุที่ไม่ซ้ำกันทุกไฟล์โดยเฉพาะ ฉันสามารถใช้สิ่งนี้เพื่อเข้าถึงโฟลเดอร์ได้หรือไม่? ฉันไม่รู้ว่าสิ่งนี้สามารถทำได้จริงหรือวิธีการทำ

ฉันคิดว่าเมื่อ Linux ใช้ระบบไฟล์มันจะเปรียบเทียบเอกลักษณ์ของชื่อไดเรกทอรีสองรายการ ดังนั้นแต่ละไดเรกทอรีจะต้องไม่ซ้ำกันในพื้นที่ แต่ฉันคิดว่ามันเหมือนกับกุญแจหลักในระบบฐานข้อมูล คีย์หลักเป็นชื่อของไดเรกทอรีหรือมีตัวระบุที่ไม่ซ้ำกันอื่น ๆ (อาจมีบางหมายเลขที่เก็บไว้ภายใต้ประทุน?)

พยายามคิดแบบนี้เหมือนเป็นกระบวนการ หากคุณดำเนินการคำสั่งpsบนเทอร์มินัลคำสั่งนั้นจะแสดงรายการกระบวนการที่มีชื่อและหมายเลขของแต่ละกระบวนการ คุณต้องเรียกกระบวนการนั้นด้วยหมายเลขกระบวนการ ในทำนองเดียวกันมีหมายเลขสำหรับไดเรกทอรีเพื่อให้คุณสามารถเรียกไดเรกทอรีที่มีหมายเลขแทนการเรียกมันด้วยชื่อหรือไม่


inodeในการสอบสวนต่อไปฉันได้พบว่าไดเรกทอรีแต่ละคนมีที่ไม่ซ้ำกัน แต่ผมยังไม่ได้เพื่อให้ห่างไกลพบใด ๆ inodeในตัวคำสั่งในการเข้าถึงไดเรกทอรีโดยตัวของมัน


1
สัญลักษณ์แทนทำงานด้วย มิฉะนั้นติดตั้งzshแทนbash
Rinzwind

สัญลักษณ์แทน Ok ไม่ใช่คำตอบที่ฉันค้นหา ต้องคิดเกี่ยวกับ zsh
Maruf

คุณต้องการเข้าถึงหนึ่งไดเรกทอรีเช่นนั้นหรือมีหลายรายการ
Sergiy Kolodyazhnyy

เพิ่มโซลูชันของคุณ (ซึ่งอาจเป็นวิธีที่น่าสนใจ) เป็นคำตอบแทนที่จะเพิ่มลงในคำถามของคุณ นั่นคือคำตอบที่ทำขึ้นสำหรับ!
kos

ทำให้โปรแกรมนั้นพิมพ์เส้นทางและทำcd $(icd XXXX)--- คุณเพิ่งเขียนfindส่วนนั้นใหม่ ตอนนี้งานต่อไปของคุณคือ ... ตรวจสอบสิ่งที่มีประสิทธิภาพมากขึ้นโปรแกรมของคุณหรือfind:-P
Rmano

คำตอบ:


2

โซลูชันที่ทำโดย OP

ไม่พบคำสั่งในตัวที่นี่ แต่ในที่สุดฉันก็สามารถเขียนโปรแกรม C เพื่อใช้ cd (ให้เรียกโปรแกรมของฉัน icd == (inode cd)) เพื่อเข้าสู่โฟลเดอร์โดยใช้ค่า inode ที่นี่ฉันกำลังโพสต์รหัสดิบ

แต่มีปัญหาพื้นฐานที่ฉันต้องเผชิญที่นี่ ในขณะที่การดำเนินการเข้ารหัสรหัส C จากทุบตีที่จำเป็นในการสร้างกระบวนการลูกภายใต้กระบวนการทุบตี (กระบวนการปกครอง) จากกระบวนการย่อยพื้นที่ไดเรกทอรีใหม่และฉันไม่สามารถเข้าถึงพื้นที่ไดเรกทอรีของกระบวนการหลักได้ ดังนั้นไม่สามารถทำอะไรได้นอกจากเรียกใช้หน้าต่างทุบตีใหม่จากที่นี่ ในอนาคตฉันจะพยายามใช้คุณสมบัติแท็บใหม่หากผู้คนสนใจสิ่งนี้ แต่ฉันเชื่อว่าฉันต้องเผชิญกับคำวิจารณ์มากมายในการทำเช่นนี้ ดังนั้นคนอาจจะไม่สนใจ ฉันเพิ่งทำเพื่อความสนุกของฉัน

มีการแชร์รหัส RAW ที่นี่

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

}

ฉันใช้เทอร์มินอล Gnome ที่นี่ เห็นได้ชัดว่าสำหรับ distro อื่น ๆ รหัสจะมีการเปลี่ยนแปลง


1
หากคุณสามารถย้ายไปยังไดเรกทอรีภายในเชลล์สคริปต์คุณสามารถระบุสคริปต์เพื่อบรรลุสิ่งที่คุณต้องการ การกำหนดนามแฝงเพื่อทำให้คำสั่งสั้นลง
daltonfury42

19

นิติบุคคลใด ๆ ใน (มากที่สุด) ระบบไฟล์บน Linux inodeมีระบุเฉพาะที่เรียกว่า ขอให้สังเกตว่าไฟล์สามารถมีมากกว่าหนึ่งชื่อ ( ฮาร์ดลิงก์) แต่ไดเรกทอรีมีเพียงหนึ่งลิงก์ในทุกระบบไฟล์ที่ฉันรู้จัก โปรดสังเกตว่าแนวคิดของ inode นั้นเป็นแบบโลคัลกับระบบไฟล์ดังนั้นในอุปกรณ์ที่แตกต่างกันสองตัว (พาร์ติชั่นหรืออะไรก็ตาม) เอกลักษณ์ที่ไม่รับประกัน

คุณสามารถดู inode ของไดเรกทอรีของคุณด้วยls -ldi:

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

ดังนั้นคุณรู้ว่าไดเรกทอรีของคุณมี inode 20873234 ตอนนี้คุณสามารถสลับไปที่มันด้วยคำสั่ง:

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

(โปรดทราบว่า2> /dev/nullจะเป็นการปิดข้อความข้อผิดพลาดเกี่ยวกับไดเรกทอรีที่ไม่สามารถอ่านได้ตามเส้นทาง)

คำสั่งนี้จะสแกนไดเรกทอรีบ้านทั้งหมดของคุณดังนั้นโปรดอดทนรอ 1

แต่สิ่งที่เกี่ยวกับการใช้cdและ TAB-shell เสร็จแล้ว?


1.นี้จะต้องเป็นที่สุด 2สิ่งที่ไม่มีประสิทธิภาพเท่าที่ผมเคยโพสต์ ... บทกวีที่เอนโทรปี เหตุผลก็คือ "คีย์หลัก" ซึ่งการเข้าถึงไฟล์หรือไดเรกทอรีได้รับการปรับให้เหมาะสมรวดเร็วและตรงคือ - เดาอะไร - ชื่อพา ธ/dir/dir/file_or_dir: นอกจากนี้เพื่อให้คุณเข้าถึงไดเรกทอรีที่กำหนดระบบจำเป็นต้องตรวจสอบสิทธิ์ทั้งหมดในพา ธ ... ดังนั้นอีกครั้งการเข้าถึงโดย inode หมายถึงการสแกนระบบไฟล์ซ้ำ

2./ดีที่คุณสามารถทำสิ่งที่เลวร้ายโดยการสแกนจาก 3

3.แต่แล้วมันจะไม่ทำงานเพราะ inodes มีความเป็นเอกลักษณ์เฉพาะในแต่ละระบบไฟล์ (ต่อเมานต์)


ขอบคุณ @ Romano ที่จริงฉันคิดเกี่ยวกับปัญหา ฉันไม่ทราบว่าปัญหาจะกลายเป็นวิธีการแก้ปัญหาที่ไม่มีประสิทธิภาพ แต่คิดเกี่ยวกับการแก้ปัญหา คุณสามารถเขียนโปรแกรม ac และใส่ลงใน / bin ได้ง่ายจากนั้นลองเรียกใช้งานด้วยหมายเลขไอโหนดเท่านั้น ฉันจะโพสต์รหัสหากฉันสามารถเขียนความคิดดังกล่าวได้
Maruf

1
และอีกคนคิดว่าฉันต้องรู้ ฉันเข้าใจส่วนแรกของคำสั่งนี้ "$ (ค้นหา ~ -inum 20873234 ******)" แต่ฉันไม่รู้ว่าทำไมคุณถึงเขียนข้อความนี้ "2> / dev / null" โปรดช่วยอธิบายอีกครั้งได้ไหม
Maruf

4
@ Maruf มันจะไม่ทำงานอย่างชาญฉลาด "กุญแจหลัก" ภายใต้การเข้าถึงแฟ้มหรือไดเรกทอรีมีการเพิ่มประสิทธิภาพได้อย่างรวดเร็วและโดยตรงคาดเดาสิ่งที่ชื่อพา ธ /dir/dir/file_or_dir... โปรแกรม C ของคุณจะต้องสแกนระบบไฟล์ด้วยและfindได้รับการปรับให้เหมาะสมในช่วง 40 ปีที่ผ่านมา ... ยังคง --- ทำไม? หากคุณต้องการทางลัดใช้แล้วa="/my/really/strange and long/dir path name/" cd "$a"ไม่สามารถเอาชนะได้ หรือใช้ symlink
Rmano

1
+1 ที่ดี ฉันอยู่ที่ขอบของการเขียนสิ่งที่คล้ายกัน แต่ฉันขี้เกียจเกินไปเนื่องจากงานนั้นไม่มีความหมายเลย @Rmano
Pilot6

3
@Rmano ฉันจะเพิ่มที่โดยทั่วไปแม้ในระบบไฟล์เดียวอาจมีหลายไฟล์ที่มี inode เดียวกันเช่น hardlinks เนื่องจากเรากำลังพูดถึงไดเรกทอรีที่นี่มันเป็นจริงที่แต่ละไดเรกทอรีมีไอโหนดที่ไม่ซ้ำกัน (ไดเรกทอรีไม่สามารถ hardlinked) นอกจากนี้ฉันคิดว่าเหตุผลที่ไม่สามารถเข้าถึงไฟล์โดยตรงผ่าน inode ของมันคือมันจะผ่านไดเรกทอรีใด ๆ การสำรวจเส้นทางจำเป็นเพื่อพิจารณาว่าผู้ใช้ได้รับอนุญาตให้เข้าถึงทรัพยากรที่เกี่ยวข้องหรือไม่ (ดังนั้นถ้า inode สามารถเข้าถึงได
เร็กตอรี่ได้

8

คุณสามารถTabหมุนโฟลเดอร์ที่มีอยู่แทนที่จะแสดงรายการ แก้ไขไฟล์~/.inputrcและเพิ่ม

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

หากคุณต้องการสำหรับผู้ใช้ทั้งหมดให้แก้ไข/etc/inputrcแทน

กดCtrl+ xและCtrl+ rเพื่อให้มีประสิทธิภาพ

ตอนนี้ใช้cdTabเพื่อนำทางไปยังโฟลเดอร์ของคุณโดยไม่ต้องเขียนชื่อ cdShift+ Tabจะหมุนในทิศทางอื่น

ควรจำไว้ว่าcd -จะนำคุณไปยังโฟลเดอร์ที่เยี่ยมชมล่าสุด


นี่เป็นคำตอบที่ดี คุณสามารถทำให้มันแสดงครั้งเดียวแล้วหมุน?
daltonfury42

1
คุณสามารถกำหนดสิ่งนี้ให้กับทางลัดอื่น ฉันใช้ Eclipse และฉันคุ้นเคยกับ Ctrl + space สำหรับ auto complete ดังนั้นฉันจึงใช้ "\ C-": menu-complete แทนปล่อยแท็บไว้เหมือนเดิม
Katu

5

คุณสามารถใช้สัญลักษณ์แทนเชลล์

ตัวอย่างเช่นฉันสามารถทำได้

cd a?b?c?d

หรือ

cd a\*b\*c\*d

และจะขยายสัญลักษณ์แทนชื่อจริงและเปลี่ยนเป็นไดเรกทอรีนั้น สมมติว่าเป็นไดเรกทอรีเดียวที่ตรงกัน

หากคุณมีทั้งสองอย่างa b c dและa1b2c3dจากนั้นcd a?b?c?dจะขยายเป็นอย่างใดอย่างหนึ่งcd a1b2c3d a b c dหรือcd a b c d a1b2c3d(คำสั่งซื้อจริงจะขึ้นอยู่กับเคอร์เนลระบบไฟล์ ... ) และ bash จะย้ายคุณไปยังเส้นทางแรกอย่างเงียบ ๆ

ในทางกลับกันคุณมักจะไม่มีโฟลเดอร์ที่มีชื่อคล้ายกันดังนั้นบางสิ่งเช่นa*dนั้นก็เพียงพอที่จะขยายได้โดยไม่ต้องพิมพ์อักขระกลางทั้งหมด สิ่งนี้มีประโยชน์เป็นพิเศษเมื่อคุณไม่สามารถพิมพ์ได้ (เช่นชื่ออยู่ในสคริปต์ที่แตกต่างกันหรือแม้แต่การเข้ารหัสที่แตกต่างกัน) และคุณจำเป็นต้องเข้ารหัสด้วยชื่อไฟล์


3

คุณสามารถค้นหาไดเรกทอรีนี้ในตัวจัดการไฟล์เช่น nautilus และเพียงแค่ลากและวางลงในเทอร์มินัล

หากก่อนหน้านี้คุณพิมพ์cdเทอร์มินัลคุณจะได้รับคำสั่ง


ที่จริงฉันพยายามทำทุกอย่างจากสถานี :) ดังนั้นไม่จำเป็นต้องคิดเกี่ยวกับหอยโข่ง ฉันคิดว่าต้องมีขั้นตอนในการเข้าถึงไฟล์ ในฐานะที่เป็น Linux จะบันทึกตัวระบุที่ไม่ซ้ำกันสำหรับไฟล์เฉพาะ แต่ฉันไม่รู้ว่าจะทำอย่างไรหรือทำสิ่งนี้ได้จริง
Maruf

มันไม่ชัดเจนในสิ่งที่คุณถาม มันเป็นไปไม่ได้ที่จะเปลี่ยนเป็นไดเรกทอรีที่ไม่ได้ใส่ชื่อของมันด้วยวิธีใดวิธีหนึ่ง
Pilot6

ดูคำสั่ง ฉันได้ทำการอัพเดทแล้ว
Maruf

หรือหากนี่เป็นปัญหาของไฟล์เดียวคุณสามารถเพิ่มนามแฝงได้
daltonfury42

1

ไม่แน่ใจว่าเป็นสิ่งที่คุณต้องการหรือไม่ แต่zshมีเคล็ดลับการเข้าถึงไดเรกทอรีโดยวิธีอื่นนอกเหนือจากการพิมพ์ชื่อที่เข้มงวดของไดเรกทอรี สำหรับหนึ่งคุณสามารถพิมพ์ส่วนหนึ่งของชื่อและมันจะขยายไปยังชื่อเต็มของไดเรกทอรีซึ่งช่วยให้สิ่งที่มีประโยชน์มากเช่น:

ป้อนคำอธิบายรูปภาพที่นี่

กำลังกดปุ่มTAB...

ป้อนคำอธิบายรูปภาพที่นี่


1

วิธีที่ง่ายที่สุดคือการดับเบิลคลิกที่ชื่อไดเรกทอรี (สมมติว่าสามารถมองเห็นได้บนหน้าจอ) จากนั้นพิมพ์ cd ตามด้วยช่องว่างแล้วคลิกปุ่มวงล้อบนเมาส์ของคุณและมันจะคัดลอกและวางชื่อไดเรกทอรีที่คุณไฮไลต์ไว้ การกดปุ่ม Enter จะเปลี่ยนเป็นไดเรกทอรีที่ต้องการ

ฉันใช้ขั้นตอนนี้ตลอดเวลาและไม่ได้ จำกัด อยู่แค่ชื่อไดเรกทอรี มันสามารถใช้สำหรับคำสั่งใด ๆ โดยใช้บรรทัดคำสั่ง

โชคดี.


นี่จะไม่หนีจากตัวละครพิเศษ
2559

1

หากเป็นเพียงหนึ่งหรือไม่กี่ไดเรกทอรีทำไมไม่มีนามแฝงใน bashrc ของคุณหรือไฟล์ init อะไรก็ตาม ตัวอย่างเช่น:

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

จากนั้นเมื่อใดก็ตามที่คุณต้องการเข้าไปที่นั่นให้พิมพ์ abc


0

คุณสามารถเขียนโปรแกรมเพื่อสร้างตารางแฮชสำหรับไดเรกทอรี OS ทั้งหมดของคุณ โดยพื้นฐานแล้วมันจะเป็นโปรแกรมทำให้แบนราบของต้นไม้

แต่จากนั้นคุณสามารถทำสิ่งที่ชอบhash-cd 32okjv02และมันจะทำการค้นหาตารางแฮชสำหรับการ32okjv02ทำแผนที่ไดเรกทอรี และข้ามไปยังไดเรกทอรีของคุณ และมันจะเร็วมาก ๆ เมื่อคุณจัดทำดัชนีไดเรกทอรีทั้งหมดแล้ว

คุณจะต้องนามแฝง mkdir เพื่อเรียกโปรแกรมนี้ทุกไดเรกทอรีใหม่และอาจเขียนคำสั่งตรวจสอบ / รีเฟรช hash-table คุณสามารถ cron ทุกนาทีและในการเข้าสู่ระบบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.