为什么不找**找到任何东西?


17

我在寻找安装在我的系统shell脚本文件,但发现不起作用:

$ find /usr -name *.sh 

但我知道有一吨的脚本在那里。例如:

$ ls /usr/local/lib/*.sh 
/usr/local/lib/tclConfig.sh 
/usr/local/lib/tkConfig.sh 

为什么不找到工作?

+2

这是一个超级用户问题? 08 11月. 092009-11-08 01:44:11

  0

这更适合于[UnixSE](http://unix.stackexchange.com/) 17 12月. 152015-12-17 10:17:21

51

尝试引用通配符:

$ find /usr -name \*.sh 

或:

$ find /usr -name '*.sh' 

如果你碰巧有一个匹配* .SH在当前工作目录文件,通配符将扩大在找到它之前。如果你碰巧有一个在你的工作目录中名为tkConfig.sh文件时,找到命令将扩展为:

$ find /usr -name tkConfig.sh 

这只会查找文件名为tkConfig.sh。如果你有一个匹配* .SH多个文件,你会得到语法错误发现

$ cd /usr/local/lib 
$ find /usr -name *.sh 
find: bad option tkConfig.sh 
find: path-list predicate-list 

再次,原因是通配符扩展到这两个文件:

$ find /usr -name tclConfig.sh tkConfig.sh 

引用通配符可防止过早扩展。

另一种可能性是/ usr或其子目录之一是符号链接。 发现没有正常跟随链接,所以你可能需要-follow选项:

$ find /usr -follow -name '*.sh' 
  0

如果文件是shell脚本但缺少'.sh'扩展名会怎么样?也许像'find/xyz | xargs文件| grep shell'? 14 12月. 152015-12-14 17:52:12

  0

虽然shell脚本**不具有.sh扩展名的频率多高? 16 12月. 152015-12-16 19:43:46

  0

是否有任何通用的方法来确定通配符何时/何地被扩展? 21 12月. 152015-12-21 09:51:50

  0

好吧,在窗口里长大的地方*所有*都有扩展名我已经在* ix上看到很多脚本,省略了'.sh' 21 12月. 152015-12-21 19:29:00


15

在某些系统(Solaris中,例如),没有默认的动作,所以你需要添加 - 打印命令。

find /usr -name '*.foo' -print 
+1

过去我一直这么做。但是我应该指出,在现代Solaris框中,-print默认打开。事实上,我似乎无法找到一个不再那样工作的发现。 08 9月. 082008-09-08 22:49:33


7

对于磁盘上的查找文件,精益使用“定位”,而不是说是瞬间 (看起来变成了一种日常内置指数) 你的例子是:

locate '/usr*.sh' 
  0

一个好建议。 (我不得不在我的机器上运行updatedb来测试这个想法,因为我的crontab中没有出于某种原因,没有最新的数据库将是不使用定位的主要原因。) 27 1月. 092009-01-27 18:39:51

  0

有几个系统没有默认安装位置 - 我发现我必须在我的Raspberry Pi上安装'mlocate'软件包 - 之后不要忘记'sudo updatedb'以构建索引... 24 12月. 152015-12-24 22:33:51