我一直在搜索一个命令,该命令将从当前目录返回包含文件名中字符串的文件。我见过locate和find命令,它们可以查找文件,从first_word*开始或以*.jpg结束。
如何返回文件名中包含字符串的文件列表?
例如,如果2012-06-04-touch-multiple-files-in-linux.markdown是当前目录中的文件。
如何返回此文件以及包含字符串touch的其他文件?使用诸如find '/touch/'之类的命令
- 这个问题令人困惑。要查找包含字符串的文件,还是要查找名称包含所述字符串的文件?第一个问题用man grep回答,第二个问题用man find回答。我不知道,你为什么要谷歌而不是用人呢?
- 谢谢!第一句没有指定是文件内容还是文件名。更新。
使用find:
find . -maxdepth 1 -name"*string*" -print
它将找到当前目录中包含"string"的所有文件(如果需要递归,则删除maxdepth 1),并将其打印到屏幕上。
如果要避免包含":"的文件,可以键入:
find . -maxdepth 1 -name"*string*" ! -name"*:*" -print
如果您想使用grep(但我认为不需要检查文件内容),您可以使用:
ls | grep touch
但是,我重复一遍,find是一个更好、更干净的解决方案。
- 谢谢@zagorax。这确实做到了。希望命令不要这么久,但是的:)
- @dru,如果你想避免冒号的话,可以修改为覆盖外壳。find是一个非常强大的工具,它一定很长。:)
- 谢谢,第一个完美的完成了,没有返回任何内容。
- @dru,如果你想缩短,你可以避开-print,因为这是默认行为,.,因为这是它检查的默认文件夹。
- 令人惊叹的。我看到自己经常用这个。我将接受你的-print和.删除建议,把它作为一个命令,并试着把*string*作为一个命令行的论点。
- find . -name"*string*"也很管用。删除.会在我的端部引发一个错误。再次感谢@zagorax。
- 只是一个观察,上面的命令抱怨了-maxdepth的观点,最好把它移到-name之前,正如@sunil dias提到的那样。
- 我有一个为给定目录工作的find *.jpg -name"*from*" -print。如何递归地进行搜索?我试过-maxdepth。
- 麦克斯迪普兄弟只做了一步,太傻了。不如使用-r或者像maxdepth 9000那样一直往下走,不是吗?除此之外,感谢您的大力响应
- 如果你能提到每一个"寻找"选项的含义,那就更好了。
- 你可能想忽略与ls | grep -i touch有关的案件。
使用grep如下:
-R表示重复发生。如果您不想进入子目录,那么跳过它。
-i的意思是"忽略大小写"。你可能觉得这个也值得一试。
- 伟大的。我注意到有些文件内容跟在EDOCX1后面(0)。还有什么可以隐瞒的吗?可能使用一个选项?
- 试一试:grep -R"touch" . | cut -d":" -f 2。
- 这似乎只产生文件的内容。你基本上回答了我的问题,不过,我可以试着做一些挖掘来保留内容。
- 啊…你只需要文件名?运行:grep -R"touch" . | cut -d":" -f 1(抱歉一定误读了你)。
- 谢谢@carlspring,这很有趣。grep或者返回包含touch的内容和文件名的文件,或者返回包含touch的内容,我还不确定是哪种情况。在返回的文件列表中,一半在标题中包含touch,另一半在正文中包含conatains touch,而不是标题。刚刚意识到这一点。
- grep扫描文件以查找特定模式。输出是:foo.txt: some text matching your pattern--它基本上输出找到匹配的行。
-maxdepth选项应在-name选项之前,如下所示。
1
| find . -maxdepth 1 -name"string" -print |
1
| find $HOME -name"hello.c" -print |
这将在整个$HOME系统(即/home/username/系统)中搜索任何名为"hello.c"的文件,并显示其路径名:
1 2
| /Users/user/Downloads/hello.c
/Users/user/hello.c |
但是,它与HELLO.C或HELLO.C不匹配。要匹配不区分大小写,请按如下方式传递-iname选项:
1
| find $HOME -iname"hello.c" -print |
样品输出:
1 2 3 4
| /Users/user/Downloads/hello.c
/Users/user/Downloads/Y/Hello.C
/Users/user/Downloads/Z/HELLO.c
/Users/user/hello.c |
通过-type f选项仅搜索文件:
1 2
| find /dir/to/search -type f -iname"fooBar.conf.sample" -print
find $HOME -type f -iname"fooBar.conf.sample" -print |
-iname在GNU或BSD(包括OS X)版本的find命令上工作。如果find命令的版本不支持-iname,请使用grep命令尝试以下语法:
1 2
| find $HOME | grep -i"hello.c"
find $HOME -name"*" -print | grep -i"hello.c" |
或尝试
1
| find $HOME -name '[hH][eE][lL][lL][oO].[cC]' -print |
样品输出:
1 2 3 4
| /Users/user/Downloads/Z/HELLO.C
/Users/user/Downloads/Z/HEllO.c
/Users/user/Downloads/hello.c
/Users/user/hello.c |
1
| find / -exec grep -lR"{test-string}" {} \; |
- 此答案被标记为低质量。请解释一下你提出的变更是怎么做的。
除了已经提供的许多解决方案之外,另一种解决方案是利用全球**。当您使用bash和选项globstar(shopt -s globstar)或使用zsh)时,您只需使用global **。
递归目录搜索名为bar的文件(可能包括当前目录中的文件bar)。请注意,这不能与同一路径段内的其他形式的全局化结合在一起;在这种情况下,*操作符将恢复其通常的效果。
请注意,这里的zsh和bash之间存在细微差异。虽然bash将遍历到目录的软链接,但zsh将不会。为此,您必须在zsh中使用global ***/。
1
| grep -R"somestring" | cut -d":" -f 1 |
- 这似乎是对另一个问题的答案——但因为你没有提供任何解释,这对提问者或其他人来说并不明显。
如果字符串在名称的开头,则可以执行此操作
1 2 3 4
| $ compgen -f .bash
.bashrc
.bash_profile
.bash_prompt |
- compgen不是一个合适的锤子。这个很少使用的工具被设计用来列出可用的命令,因此,它列出了当前目录中的文件(可以是脚本),它既不能重复,也不能越过文件名的开头查看,也不能搜索文件内容,这使得它基本上没用。