Linux 终端中有没有办法在不指定确切路径的情况下引用非常深的目录结构中的文件?
例如,如果您知道您有一个名为qstr.js
3-4 个目录深度的文件(例如qtools\modules\version001\tests\qstr.js
),是否可以输入以下内容:
cp qs*
然后让它搜索并找到这个文件,这样你就可以用 TAB 键输入完整路径和文件名?
Git 有类似的功能,它允许您引用目录深处的工作目录文件。
答案1
/usr $ shopt -s globstar
/usr $ cp **/firefox*<Tab>
firefox-developer-edition firefox-developer-edition.png firefox-developer-edition.png firefox-developer-edition-symbolic.svg firefox.png
firefox-developer-edition/ firefox-developer-edition.png firefox-developer-edition.png firefox.png firefox.png
firefox firefox-developer-edition.png firefox-developer-edition.png firefox.png
[...]
# a few more <Tab>s later
/usr $ cp share/icons/hicolor/384x384/apps/firefox-developer-edition.png
(后一种行为需要menu-complete
.)
您可以尝试使用fzf
(“命令行模糊查找器”)。安装它并启用 bash 的完成和键绑定后,CtrlT将提示您:
> firefx桌面 1/722561 > 分享/应用/火力夫哦X- 开发者版本。桌子t操作
然后按Enter会将所选路径粘贴到命令行。
答案2
我用了find
很多。我承认我可能没有充分利用该工具的潜力,但只是找到一个文件就可以做到find -name foo
。请注意单破折号,它只会在子目录中搜索。您还可以使用find -path
搜索整个路径。例如,如果您只想在文件夹“foo”中查找文件“bar.txt”,您可以这样做find -path */foo/bar.txt
。
答案3
此外@西蒙的答案,updatedb
和locate
命令将会引起您的兴趣。根据您的发行版,您可能需要mlocate
先安装该软件包。
在大多数情况下,您可以互换使用find
和locate
。他们之间唯一的区别在于他们如何在内部实现目标,这使得他们都有自己固有的优点和缺点。您可以通过阅读了解更多信息对类似问题的这个很好的回答。