Linux find 命令

2017-07-04|Categories: External cmd, Linux|

搜索结果是否包含隐藏目录(.开头)

  • 包含:
    find . -maxdepth 1 -type d -not -name 'tlcl-book'
    

  • 不包含:
    find . -maxdepth 1 -type d -not -name 'tlcl-book' -not -name ".*"
    

find如何解释正则表达式

find命令支持多种正则表达式语法,find -regextype help可以查询-regextype支持的参数:

默认的正则语法是emacs官方文档对不同的正则语法有详细的描述,可以通过-regextype改变正则语法:

find /var/www/icons -regextype posix-extended -regex '.*\.(gif|png)'

不显示警告或错误信息

/开始查找,在/proc/等目录会出现错误:

find: './proc/18/task/18/fd': Permission denied
find: './proc/18/task/18/fdinfo': Permission denied
find: './proc/18/task/18/ns': Permission denied

可以通过重定向解决:

find / -name "my.txt" 2>/dev/null

搜索关键词必须使用引号包围 2017-09-13

例如在/usr/share/man搜索以man开头的目录名:

find . -maxdepth 1 -name 'man*' -exec ls -ldth {} \+

如果不用引号包围man*,就会报错find: paths must precede expression: man1,因为*会被Bash当做文件名通配符提前展开,然后把值传递给find命令,展开的值是当前目录下一系列以man开头的文件名,而find -name选项需要的值是一个匹配文件名的模式的字符串(glob pattern),错误因此产生。

不搜索特定目录下的文件

find / -not -path "/proc/*" -not -path "/run/*" -perm /6000 -exec ls -l {} \+ > find-6000.txt

关键在于路径名的写法:

  • -path "/dir_name",无效
  • -path "/dir_name/",报错
  • -path "/dir_name/*",正确

搜索结果完全剔除特定目录及其包含的文件 2018-01-13

-not -path "/dir_name/*"这种用法存在一个问题:/dir_name仍然会出现在搜索结果中!

解决方法是改成-path "/dir_name" -prune -or -print,这里必须要添加-or -print,意思是对于那些不匹配-path "/dir_name" -prune的文件执行-print

即使如此,表示当前搜索目录的圆点.始终显示在搜索结果中,如果要去除,就需要加上-mindepth 1

Leave A Comment