我正在尝试运行一个发现 命令 </跨度> 对于所有JavaScript文件,但如何排除特定目录?
这是我们正在使用的查找代码。
for $(find。-name’* .js’)中的文件做 java -jar config / yuicompressor-2.4.2.jar –type js $ file -o $ fileDONE
-path -prune方法也适用于路径中的通配符。这是一个find语句,它将找到服务于多个git存储库的git服务器的目录,而不包括git内部目录:
find . -type d \ -not \( -path */objects -prune \) \ -not \( -path */branches -prune \) \ -not \( -path */refs -prune \) \ -not \( -path */logs -prune \) \ -not \( -path */.git -prune \) \ -not \( -path */info -prune \) \ -not \( -path */hooks -prune \)
我试过上面的命令,但没有一个使用“-prune”的人对我有效。 最后我用下面的命令尝试了这个:
find . \( -name "*" \) -prune -a ! -name "directory"
这是因为 find 的 试验 强> 的文件 的 图案 强> “ * FOO * “:
find
find ! -path "dir1" ! -path "dir2" -name "*foo*"
但确实如此 的 不 强> 如果你不使用一个工作 的 图案 强> ( find 才不是 的 测试 强> 文件)。所以 find 不使用它以前的评估“ 真正 “&amp;” 假 “bools。上述表示法不工作用例的示例:
find ! -path "dir1" ! -path "dir2" -type f
没有 find 测试!因此,如果您需要查找没有任何模式匹配的文件,请使用-prune。另外,通过使用修剪 find 总是更快,而它真的跳过该目录而不是匹配它或更好地不匹配它。所以在这种情况下使用类似的东西:
find dir -not \( -path "dir1" -prune \) -not \( -path "dir2" -prune \) -type f
要么:
find dir -not \( -path "dir1" -o -path "dir2" -prune \) -type f
问候
有很多好的答案,我花了一些时间来理解命令的每个元素是什么以及它背后的逻辑。
find . -path ./misc -prune -o -name '*.txt' -print
find将开始在当前目录中查找文件和目录,因此 find . 。
find .
该 -o option代表逻辑OR并分隔命令的两个部分:
-o
[ -path ./misc -prune ] OR [ -name '*.txt' -print ]
任何目录或文件 的 不 强> ./misc目录不会通过第一次测试 -path ./misc 。但他们将针对第二个表达进行测试。如果他们的名字对应于模式 *.txt 他们得到印刷,因为 -print 选项。
-path ./misc
*.txt
-print
当find到达./misc目录时,此目录仅满足第一个表达式。所以 -prune 选项将适用于它。它告诉find命令 的 不 强> 探索那个目录。因此,./misc中的任何文件或目录都不会被find探索,也不会针对表达式的第二部分进行测试,也不会被打印。
-prune
一种选择是使用grep排除包含目录名称的所有结果。例如:
find . -name '*.js' | grep -v excludeddir
使用剪枝开关,例如,如果要排除 misc 目录只需添加一个 -path ./misc -prune -o 找到命令:
misc
-path ./misc -prune -o
这是一个包含多个目录的示例:
find . -type d \( -path dir1 -o -path dir2 -o -path dir3 \) -prune -o -print
这里我们排除dir1,dir2和dir3,因为在 find 表达式它是一个行动,作用于标准 -path dir1 -o -path dir2 -o -path dir3 (如果dir1或dir2或dir3),则与 type -d 。进一步的行动是 -o print ,只是打印。
-path dir1 -o -path dir2 -o -path dir3
type -d
-o print
我在用 find 提供文件列表 xgettext ,并希望省略特定目录及其内容。我尝试了许多排列 -path 结合 -prune 但无法完全排除我想要的目录。
xgettext
-path
虽然我能够忽略了 内容 我想忽略的目录, find 然后返回目录本身作为结果之一,这导致 xgettext 结果崩溃(不接受目录;只接受文件)。
我的解决方案是简单地使用 grep -v 跳过结果中我不想要的目录:
grep -v
find /project/directory -iname '*.php' -or -iname '*.phtml' | grep -iv '/some/directory' | xargs xgettext
是否有争论 find 这将是100%的工作,我不能肯定地说。运用 grep 在经历了一些头痛之后,这是一个快速而简单
grep
如何使用的 - 李子 - 选项 - 的 - 发现 - 在-SH 是一个很好的答案 劳伦斯贡萨尔维斯 如何 -prune 作品。
以下是通用解决方案:
find /path/to/search \ -type d \ \( -path /path/to/search/exclude_me \ -o \ -name exclude_me_too_anywhere \ \) \ -prune \ -o \ -type f -name '*\.js' -print
为了避免打字 /path/to/seach/ 多次,包裹 find 在一个 pushd .. popd 对。
/path/to/seach/
pushd .. popd
pushd /path/to/search; \ find . \ -type d \ \( -path ./exclude_me \ -o \ -name exclude_me_too_anywhere \ \) \ -prune \ -o \ -type f -name '*\.js' -print; \ popd
这是我用来排除某些路径的格式:
$ find ./ -type f -name "pattern" ! -path "excluded path" ! -path "excluded path"
我用它来查找不在“。*”路径中的所有文件:
$ find ./ -type f -name "*" ! -path "./.*" ! -path "./*/.*"
find . -name '*.js' -\! -name 'glob-for-excluded-dir' -prune
对于那些无法使用的旧版UNIX的用户 的 -路径 强> 要么 的 -不 强>
在SunOS 5.10 bash 3.2和SunOS 5.11 bash 4.4上测试
find . -type f -name "*" -o -type d -name "*excluded_directory*" -prune -type f
这里有很多答案;我不愿意添加另一个,但我认为这些信息很有用。
的 TLDR: 强> 了解您的根目录并从那里定制您的搜索,使用“ -prune “ 选项。
的 背景: 强> 我有一个 rsnapshot ( rsync )备份位置, /mnt/Backups/ ,在搜索系统时会引起头痛( / )文件,因为这些备份包含~4.5TB(terra)的文件!
rsnapshot
rsync
/mnt/Backups/
/
我也有 /mnt/Vancouver ,我的主要工作文件夹与TB的文件,备份[ /mnt/Backups/ 和 /mnt/Vancouver/ 物理(冗余)安装在不同的驱动器上]。
/mnt/Vancouver
/mnt/Vancouver/
这里有两个最佳答案( 如何在find中排除目录。命令 ),我发现使用接受的答案搜索系统文件是 的 许多 强> 更快,有警告。
这个
find / -path /mnt -prune -o -name "*libname-server-2.a*" -print
在~3-4秒内找到该文件;这个
find / -name "*libname-server-2.a*" -not -path "/mnt/*"
出现(?)来递归所有被排除的目录(深层嵌套 rsync 所有已安装卷的快照),因此需要 的 永远 强> 。我假设它正在搜索多TB的文件,所以它无休止地陷入困境。例如,如果我试图“时间”搜索( time find ... ),我看到丰富的输出 - 暗示 find 正在深入遍历“排除”目录:
time find ...
... find: ��/mnt/Backups/rsnapshot_backups/monthly.0/snapshot_root/var/lib/udisks2��: Permission denied ...
在排除目录后附加正斜杠( /mnt/ )或嵌套路径(`/ mnt / Backups')导致搜索 的 再次* 强> 永远服用:
/mnt/
的 慢: 强>
find / -path /mnt/ -prune -o -name "*libname-server-2.a*" -print find / -path /mnt/Vancouver -prune -o -name "*libname-server-2.a*" -print
的 “解” 强>
这是最好的解决方案(所有这些都在几秒钟内执行)。同样,我的目录结构是
/mnt/Backups
/home/*
/home/victoria
~
的 系统文件( / ): 强>
要快速查找系统文件,请排除 /mnt ( 的 不 强> /mnt/ 要么 /mnt/Backups ,...):
/mnt
$ find / -path /mnt -prune -o -name "*libname-server-2.a*" -print /usr/lib/libname-server-2.a
在~3-4秒内找到该文件。
的 非系统文件: 强>
例如。快速找到我的两个工作“驱动器”之一的文件, /mnt/Vancouver/ 和/或 /home/victoria/ )。
/home/victoria/
$ find /mnt/Vancouver/ -name "*04t8ugijrlkj.jpg" /mnt/Vancouver/temp/04t8ugijrlkj.jpg $ find /home/victoria -iname "*Untitled Document 1" /home/victoria/backups/shortcuts.bak.2016.11.02/Untitled Document 1 /home/victoria/Untitled Document 1
的 备份: 强>
例如。在我的每小时/每日/每周/每月备份之一中查找已删除的文件。
$ find /mnt/Backups/rsnapshot_backups/daily.0 -name "*04t8ugijrlkj.jpg" /mnt/Backups/rsnapshot_backups/daily.0/snapshot_root/mnt/Vancouver/temp/04t8ugijrlkj.jpg
的 在旁边: 强> 在命令末尾添加-print会抑制排除目录的打印输出:
$ find / -path /mnt -prune -o -name "*libname-server-2.a*" /mnt /usr/lib/libname-server-2.a $ find / -path /mnt -prune -o -name "*libname-server-2.a*" -print /usr/lib/libname-server-2.a $
如果搜索目录有模式(在我的情况下大多数情况下);你可以像下面这样简单地做:
find ./n* -name "*.tcl"
在上面的例子中;它搜索以“n”开头的所有子目录。
我发现以下比其他提出的解决方案更容易推理:
find build -not \( -path build/external -prune \) -name \*.js
这来自一个实际的用例,我需要在wintersmith生成的一些文件上调用yui-compressor,但是遗漏了需要按原样发送的其他文件。
内 \( 和 \) 是一个匹配的表达式 的 究竟 强> build/external (它会 不 如果你做了匹配 find ./build 例如 - 您需要将其更改为 ./build/external 在那种情况下),并将成功, 避免穿越下面的任何东西 。然后将其分组为带有转义括号的单个表达式,并以前缀为前缀 -not 这将使 find 跳过与该表达式匹配的任何内容。
\(
\)
build/external
find ./build
./build/external
-not
有人可能会问是否添加 -not 不会隐藏所有其他文件 -prune 重新出现,答案是否定的。方式 -prune 可行的是,一旦到达,该目录下面的文件将被永久忽略。
这也很容易扩展,以添加额外的排除。例如:
find build -not \( -path build/external -prune \) -not \( -path build/blog -prune \) -name \*.js
对于 FreeBSD的 用户:
find . -name '*.js' -not -path '*exclude/this/dir*'
find -name '*.js' -not -path './node_modules/*' -not -path './vendor/*'
似乎工作相同
find -name '*.js' -not \( -path './node_modules/*' -o -path './vendor/*' \)
并且更容易记住IMO。
对于我需要的东西,它就像这样,找到了 landscape.jpg 在所有服务器从root开始并排除搜索 /var 目录:
landscape.jpg
/var
find / -maxdepth 1 -type d | grep -v /var | xargs -I '{}' find '{}' -name landscape.jpg
find / -maxdepth 1 -type d 列出所有 的 d 强> inrereies in /
find / -maxdepth 1 -type d
grep -v /var 从列表中排除`/ var'
grep -v /var
xargs -I '{}' find '{}' -name landscape.jpg 执行任何命令,比如 find 与列表中的每个目录/结果
xargs -I '{}' find '{}' -name landscape.jpg