找到文件然后cd到Linux中的该目录

Can*_*oss 23 linux filesystems shell

在shell脚本中,如何通过特定名称查找文件,然后导航到该目录以对其进行进一步操作?

从这里开始,我将把文件复制到另一个目录(但是我可以将其添加到上下文中.)

pax*_*blo 24

您可以使用以下内容:

pax[/home/pax]> cd "$(dirname "$(find / -type f -name ls | head -1)")"
pax[/usr/bin]> _
Run Code Online (Sandbox Code Playgroud)

这将找到第一个ls常规文件,然后切换到该目录.

就每个位的作用而言:

  • /搜索将从搜索开始并向下搜索,列出所有常规文件(-type f),名为ls(-name ls).您还可以添加其他内容find以进一步限制所获得的文件.
  • 通过管道head -1将过滤除第一个以外的所有.
  • $()是一种获取命令输出并将其放在命令行上以获取另一个命令的方法.
  • dirname 可以采用完整的文件规范并为您提供路径位.
  • cd 只是更改到该目录.

如果按顺序执行每个位,您可以看到发生了什么:

pax[/home/pax]> find / -type f -name ls
/usr/bin/ls

pax[/home/pax]> find / -type f -name ls | head -1
/usr/bin/ls

pax[/home/pax]> dirname "$(find / -type f -name ls | head -1)"
/usr/bin

pax[/home/pax]> cd "$(dirname "$(find / -type f -name ls | head -1)")"

pax[/usr/bin]> _
Run Code Online (Sandbox Code Playgroud)


Phi*_*ipp 11

以下应该更安全:

cd -- "$(find / -name ls -type f -printf '%h' -quit)"
Run Code Online (Sandbox Code Playgroud)

好处:

  • 双短划线阻止了以连字符作为选项开头的目录名称的解释(find不产生这样的文件名,但它没有害处,可能是类似构造所必需的)
  • -name检查前-type检查,因为后者有时需要stat
  • 没有dirname必需,因为说明%h符已经打印了目录名称
  • -quit在找到第一个文件后停止搜索,因此head不需要哪个会导致脚本在包含换行符的目录名称上失败


zza*_*per 5

没有人建议定位(对于大树,这要快得多)?

zsh:

cd $(locate zoo.txt|head -1)(:h)
cd ${$(locate zoo.txt)[1]:h}
cd ${$(locate -r "/zoo.txt$")[1]:h}   

or could be slow

cd **/zoo.txt(:h)
Run Code Online (Sandbox Code Playgroud)

重击:

cd $(dirname $(locate -l1 -r "/zoo.txt$"))
Run Code Online (Sandbox Code Playgroud)