如何在不写目录名称的情况下将其复制到目录?


8

有时使用文件夹名称访问目录很烦人。说我有一个名为的目录a b c d。除了使用之外Tab,是否有其他方法可以在不键入目录名称的情况下访问该文件夹?

我知道Linux在每个特定文件中都有一个唯一的标识符。我可以用它来访问文件夹吗?我不知道这是否可以实际完成或如何执行。

我认为Linux在实现文件系统时会比较两个目录名称的唯一性。因此,每个目录在一个空间中必须是唯一的。但是我认为这就像数据库系统中的主键。是主键的名称目录的或者是有一些其他的唯一标识符(可能存储一些数字“引擎盖下”)?

尝试将其视为一个过程。如果ps在终端上执行该命令,它将输出一个进程列表以及每个进程的名称和编号。您必须使用流程号调用该流程。同样,目录是否有号码,以便您可以使用目录号来调用目录,而不用名称来调用目录?


在进一步调查中,我发现每个目录都有一个唯一的inode。但是,到目前为止,我还没有找到任何内置命令来通过其访问目录inode


1
通配符也可以。否则安装zsh而不是bash
Rinzwind

好通配符不是我想要的答案。需要考虑zsh
Maruf

您需要访问一个目录,还是多个目录?
Sergiy Kolodyazhnyy

添加您的解决方案(可能会很有趣)作为答案,而不是将其添加到您的问题中。这就是答案!
kos 2015年

使该程序仅打印路径并执行cd $(icd XXXX)---您只需重写该find部分。现在,您的下一个任务是...检查效率更高的程序或find:-P。
Rmano

Answers:


2

OP的解决方案

在此找不到内置命令。但是最后我能够编写一个使用cd的C程序(让我使用icd ==(inode cd)调用我的程序)以使用inode值进入文件夹。我在这里发布原始代码。

但是,我在这里面临一个基本问题。从bash编码执行C代码时,需要在bash进程(父进程)下创建子进程。在子进程中,目录空间是新的,我无法从那里访问父进程的目录空间。因此,除了从此处调用新的bash窗口外,什么也做不了。如果人们对此感兴趣,将来我将尝试实现新的标签功能。但是我相信我在这样做方面面临很多批评。因此人们可能不感兴趣。我只是为了娱乐而做。

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终端。显然,对于其他发行版,代码将被更改。


1
如果可以移至Shell脚本中的目录,则可以提供脚本源以完成所需的操作。定义别名以缩短命令。
daltonfury42

19

Linux(大多数)文件系统中的任何实体都有一个唯一的标识符,称为inode。请注意,一个文件可以有多个名称(hardlink),但是目录在我所知道的所有文件系统中只有一个链接。请注意,inode的概念是文件系统本地的,因此在两个不同的设备(分区或任何其他设备)中,不能保证唯一性。

您可以使用以下命令查看目录的索引节点ls -ldi

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

所以您知道您的目录具有inode20873234。现在您可以使用以下命令切换到该目录:

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

(请注意,这2> /dev/null是要关闭有关路径中不可读目录的错误消息。)

此命令将扫描整个主目录,因此请耐心等待。1个

但是,如何使用cd和您的shell的TAB完成功能呢?


1.这肯定是我发布过的最无效的 2件事……是对熵的颂歌。原因是优化或快速直接访问文件或目录的“主键”是-猜怎么着?—路径名:/dir/dir/file_or_dir。而且,要授予您对给定目录的访问权限,系统需要检查路径中的所有权限...因此,再次,通过inode访问意味着递归扫描文件系统。

2.好吧,您可以通过从扫描使情况变得更糟/3

3.但是那样就行不通了,因为inode仅在每个文件系统(每个装载)的基础上是唯一的。


谢谢@Romano。其实我在想这个问题。我不知道问题会变成如此低效的解决方案。但是请考虑解决方案。您可以轻松地编写一个ac程序并将其放入/ bin,然后尝试使用唯一的inode编号执行它。如果能够写出这样的想法,我将发布代码。
Maruf

1
还有一个我想知道的 我了解此命令的第一部分。“ $(找到〜-inum 20873234 ******)”。但是我不知道你为什么要写这个,“ 2> / dev / null”。你能再说一遍吗?
2015年

4
@Maruf,出于效率考虑,它将无法正常工作。猜测路径或路径名称是快速,直接地优化对文件或目录的访问的“主键” /dir/dir/file_or_dir。您的C程序也将需要扫描文件系统,并且find在最近40年中进行了优化……仍然---为什么?如果需要快捷方式,请使用a="/my/really/strange and long/dir path name/",然后使用cd "$a"。不能打败它。或使用符号链接。
Rmano

1
一个不错的+1。我当时正在写类似的文章,但是我太懒了,因为这项任务根本没有意义。@Rmano
Pilot6

3
@Rmano我要补充一点,一般来说,即使在单个文件系统上,也可能会有多个文件具有相同的inode,即硬链接。因为我们在这里谈论目录,所以每个目录都有一个唯一的索引节点(目录不能被硬链接。)而且,我认为不能通过索引节点直接访问文件的原因是,它将绕过任何目录遍历,以确定是否允许用户访问相应资源。(因此,如果目录可由其
索引

8

您可以Tab旋转可用文件夹而不是列出它们。编辑文件~/.inputrc并添加

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

如果需要所有用户使用,请进行编辑/etc/inputrc

Ctrl+ xCtrl+ r使其生效。

现在用于cdTab导航到您的文件夹,而无需输入其名称。cdShift+ Tab将向另一个方向旋转。

值得记住的是,这cd -会将您带到上次访问的文件夹。


这是一个很好的答案。您可以先显示一次然后旋转吗?
daltonfury42 2015年

1
您可以将其分配给另一个快捷方式。我使用Eclipse,并且习惯于使用Ctrl +空格键来自动完成,所以我使用“ \ C-”:menu-complete来代替,保持制表符不变。
卡图

5

您可以使用外壳通配符。

例如我可以

cd a?b?c?d

要么

cd a\*b\*c\*d

它将通配符扩展为实际名称并更改为该目录。假设这是唯一匹配的目录。

如果您同时拥有a b c da1b2c3dcd a?b?c?d则将扩展为cd a1b2c3d a b c dcd a b c d a1b2c3d(实际顺序将取决于内核,文件系统...),而bash会将您静默地移至第一个路径。

另一方面,您通常没有如此相似的文件夹,因此类似这样的东西a*d足以扩展它而不必键入所有中间字符。当您实际上无法键入它时(例如,名称使用不同的脚本,甚至使用不同的编码),并且否则您将需要对文件名进行八进制编码时,此功能特别有用。


3

您可以在文件管理器(例如nautilus)中找到此目录,然后将其拖放到终端。

如果您以前输入cd终端,将得到命令。


实际上,我正在尝试从终端执行所有操作。:)。因此,无需考虑鹦鹉螺。我认为必须有一个访问文件的程序。由于Linux总是为特定文件保存唯一标识符。但是我不知道该怎么做,或者我真的可以做到这一点。
Maruf

您不清楚您要问什么。无法更改为未以某种方式输入名称的目录。
飞行员

参见声明。我已经更新了。
Maruf 2015年

或者,如果这是单个文件的问题,则可以添加别名。
daltonfury42

1

不确定这是否正是您要的内容,但是zsh除了输入目录的严格名称之外,还有一些巧妙的技巧可以通过其他方式访问目录;例如,您可以键入名称的一部分,然后它将扩展为目录的全名,这允许使用非常有用的内容,例如:

在此处输入图片说明

击中TAB...

在此处输入图片说明


1

最简单的方法是双击目录名(假设它在屏幕上可见),然后键入cd,然后按空格键,然后单击鼠标上的滚轮按钮,它将复制并粘贴突出显示的目录名。然后按Enter键将切换到所需目录。

我一直在使用此过程,而不仅限于目录名。它可以用于使用命令行的任何命令。

祝好运。


这不会逃避特殊字符
氨基脲

1

如果只是一个或几个目录,为什么在您的bashrc或任何init文件中不包含别名?例如:

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

然后,只要您想进入那里,只要输入 abc


0

您可以编写程序为所有OS目录创建哈希表。它基本上是一个树展平程序。

但是然后您可以做类似的事情,hash-cd 32okjv02并且它将对32okjv02到目录的映射进行哈希表查找。并跳到您的目录。一旦索引了所有目录,它就会非常快。

您必须为mkdir加上别名,才能在每个新目录中调用该程序,并且可能编写一个哈希表检查/刷新命令,您可以在登录时每分钟进行一次cron。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.