如何在find中排除目录。命令

别来无恙 提交于 2019-12-26 09:46:04

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

我正在尝试为所有JavaScript文件运行find命令,但是如何排除特定目录?

这是我们正在使用的find代码。

for file in $(find . -name '*.js')
do 
  java -jar config/yuicompressor-2.4.2.jar --type js $file -o $file
done

#1楼

如果-prune不适合您,这将:

find -name "*.js" -not -path "./directory/*"

警告:需要遍历所有不需要的目录。


#2楼

我发现以下比其他提出的解决方案更容易推理:

find build -not \( -path build/external -prune \) -name \*.js
# you can also exclude multiple paths
find build -not \( -path build/external -prune \) -not \( -path build/blog -prune \) -name \*.js

重要说明:-path之后键入的路径必须与在不排除的情况下打印的find完全匹配。 如果这句话混淆了你,请确保在整个命令中使用完整路径,如下所示: find /full/path/ -not \\( -path /full/path/exclude/this -prune \\) ... 如果您想要更好的理解,请参阅注释[1]。

内部\\(\\)是一个完全匹配build/external的表达式(参见上面的重要说明),并且在成功时将避免遍历下面的任何内容 。 然后将其分组为带有转义括号的单个表达式,并以-not为前缀,这将使find跳过与该表达式匹配的任何内容。

有人可能会问,如果添加-not不会使-prune隐藏的所有其他文件重新出现,答案是否定的。 -prune工作方式是,一旦到达,该目录下面的文件将被永久忽略。

这来自一个实际的用例,我需要在wintersmith生成的一些文件上调用yui-compressor,但是遗漏了需要按原样发送的其他文件。


注意[1] :如果要排除/tmp/foo/bar并运行find这样的“ find /tmp \\(... ”那么你必须指定-path /tmp/foo/bar 。如果另一方面你运行发现像这样的cd /tmp; find . \\(...然后你必须指定-path ./foo/bar


#3楼

我使用findxgettext提供了一个文件列表,并希望省略特定目录及其内容。 我尝试了-path-prune相结合的许多排列,但无法完全排除我想要的目录。

虽然我能够忽略我想忽略的目录的内容 ,但是find然后返回目录本身作为结果之一,这导致xgettext而崩溃(不接受目录;只接受文件)。

我的解决方案是简单地使用grep -v跳过结果中我不想要的目录:

find /project/directory -iname '*.php' -or -iname '*.phtml' | grep -iv '/some/directory' | xargs xgettext

无论是否存在可以100%发挥作用的find论证,我都不能肯定地说。 经过一些头痛之后,使用grep是一种快速简便的解决方案。


#4楼

以前的答案都不适合Ubuntu。 试试这个:

find . ! -path "*/test/*" -type f -name "*.js" ! -name "*-min-*" ! -name "*console*"

在这里找到了这个


#5楼

对于工作解决方案(在Ubuntu 12.04(精确穿山甲)上测试)...

find ! -path "dir1" -iname "*.mp3"

将在dir1子文件夹中搜索当前文件夹和子文件夹中的MP3文件。

使用:

find ! -path "dir1" ! -path "dir2" -iname "*.mp3"

...排除dir1和dir2

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!