【推荐】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楼
我使用find
为xgettext
提供了一个文件列表,并希望省略特定目录及其内容。 我尝试了-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
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3147502