使用Unix / Linux查找时排除隐藏文件?


35

我需要使用哪些选项find来排除隐藏文件?


4
除了:该任务没有特殊支持的原因是,对于以“。”开头的文件,唯一的特殊之处。ls除非有特别要求,否则没有列出:这些文件在各个方面都是完全普通的文件,这只是ls默认情况下您可以忽略它们。
dmckee 2010年

2
问题:您想隐藏类似的东西.hidden/visible.txt吗?
基思·汤普森

Answers:


14

我在这里找到这个:

find . \( ! -regex '.*/\..*' \) -type f -name "whatever"

为什么不只是\( ! -name '.*' \)呢?
grawity 2010年

@grawity我刚刚发现,我不完全知道它是如何工作的。您不仅会隐藏隐藏文件,还会在子文件夹中隐藏隐藏目录及其所有子内容和隐藏文件吗?
Jarvin 2010年

5
不,不是:/但是\( ! -path '*/.*' \)会。
grawity 2010年

@grawity Ya,我想我对OP的要求进行了假设...您的-name解决方案可能与他们的要求最接近。
Jarvin 2010年

@ grawity&Dan:是(!-path'^。*')吗?您的解决方案将忽略任何带有“。”的文件。文件名中的任何位置,例如a.exe,b.out等...
Software Mechanic

13

否定全局模式似乎并不为人所知。因此,您可以使用:

find . -name "[!.]*"

12

这不会回答您的问题,但是对于查找非隐藏文件的任务,我希望让find查找所有文件,然后使用grep进行过滤。

find . -type f | grep -v '/\.'

与您的方法类似,但可能更简单。


这是为我工作的唯一班轮之一。
2016年

7

尝试以下find用法:

find . -type f -not -path '*/\.*'

它将忽略所有隐藏文件(以点开头的文件和目录)。


1

我写了一个叫做的脚本findnh,我认为它比在网络上能找到的解决此问题的答案要好。

#!/bin/bash

declare -a paths

while [ $# -ne 0 ]; do
  case "$1" in -*) break ;; esac
  paths+=("$1")
  shift
done

find "${paths[@]}" \( -name . -o -name .. -o \! \( -name '.*' -prune \) \) "$@"

例如,您可以使用像这样的命令在显式指定的隐藏目录中找到未隐藏的文件和目录,该命令findnh ~/.hiddendir/将显示,~/.hiddendir/file但不会显示~/.hiddendir/.superhiddenfile


1
不错的编码。除了,当我尝试时findnh ~/.hiddendir/,我什么也没有。除此之外,这与! -path '*/.*'find … | grep -v '/\.'有何不同?
G-Man说'Resstate Monica'2014/

1

如果您的目标是findgrepripgrep则默认情况下确实排除隐藏文件,例如

rg --files

--files 打印将要搜索的每个文件,而无需实际执行搜索。


1

fd

使用fd,是的一种简单,快捷,易用的替代方法find。默认情况下,它:

  • 默认情况下,忽略隐藏的目录和文件。
  • .gitignore默认情况下,忽略您的模式。

检查基准分析


1

查找隐藏文件:

find -name '[.]*'

查找可见文件:

find -name '[!.]*'

就这么简单。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.