我一直在寻找一个命令,将从当前目录返回文件,其中包含文件名中的字符串。我已经看到locate和find命令可以找到以first_word*开头或以*.jpg结尾的文件。
locate
find
first_word*
*.jpg
如何返回包含文件名字符串的文件列表?
例如,如果2012-06-04-touch-multiple-files-in-linux.markdown是当前目录中的一个文件。
2012-06-04-touch-multiple-files-in-linux.markdown
我如何返回这个文件和其他包含字符串touch的文件?使用像find '/touch/'这样的命令
touch
find '/touch/'
使用grep的方法如下:
grep -R "touch" .
-R表示递归。如果您不愿意进入子目录,那么可以跳过它。
-R
-i表示“忽略大小写”。你可能会发现这也值得一试。
-i
使用find:
find . -maxdepth 1 -name "*string*" -print
它会找到当前目录中所有包含“string”的文件(如果你想递归,可以删除maxdepth 1),并将其打印在屏幕上。
maxdepth 1
如果你想避免包含':'的文件,你可以输入:
find . -maxdepth 1 -name "*string*" ! -name "*:*" -print
如果你想使用grep(但我认为这是不必要的,只要你不想检查文件内容),你可以使用:
grep
ls | grep touch
但是,我重复一遍,find对你的任务来说是一个更好、更干净的解决方案。
如果字符串位于名称的开头,则可以这样做
$ compgen -f .bash .bashrc .bash_profile .bash_prompt
-maxdepth选项应该在-name选项之前,如下所示。
-maxdepth
-name
find . -maxdepth 1 -name "string" -print
find $HOME -name "hello.c" -print
这将在整个$HOME(即/home/username/)系统中搜索任何名为“hello.c”的文件,并显示它们的路径名:
$HOME
/home/username/
/Users/user/Downloads/hello.c /Users/user/hello.c
但是,它不会匹配HELLO.C或HellO.C。要匹配是不区分大小写的,传递-iname选项如下:
HELLO.C
HellO.C
-iname
find $HOME -iname "hello.c" -print
示例输出:
/Users/user/Downloads/hello.c /Users/user/Downloads/Y/Hello.C /Users/user/Downloads/Z/HELLO.c /Users/user/hello.c
传递-type f选项只搜索文件:
-type f
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命令版本不支持-iname,请使用grep命令尝试以下语法:
find $HOME | grep -i "hello.c" find $HOME -name "*" -print | grep -i "hello.c"
或者尝试
find $HOME -name '[hH][eE][lL][lL][oO].[cC]' -print
/Users/user/Downloads/Z/HELLO.C /Users/user/Downloads/Z/HEllO.c /Users/user/Downloads/hello.c /Users/user/hello.c
grep -R "somestring" | cut -d ":" -f 1
已经提供的许多解决方案的替代方案是使用glob **。当你使用带有选项globstar (shopt -s globstar)的bash或使用zsh时,你可以只使用glob **。
**
globstar
shopt -s globstar
bash
zsh
**/bar
对命名为bar的文件进行递归目录搜索(可能包括当前目录中的文件bar)。注意,这不能与同一路径段内的其他形式的通配符组合;在这种情况下,*操作符恢复其通常的效果。
bar
*
注意,这里的zsh和bash之间有一个微妙的区别。虽然bash将遍历到目录的软链接,但zsh不会。为此,你必须在zsh中使用glob ***/。
***/
find / -exec grep -lR "{test-string}" {} \;