当前位置: 首页 > 面试题库 >

使用bash,如何从目录中的所有文件中创建类路径?

空慈
2023-03-14
问题内容

对于bash大师来说,这将是一个 非常 简单的免费赠品:

使用bash,如何从目录中的所有文件中创建类路径?

细节

给定目录:

LIB=/path/to/project/dir/lib

除了* .jar文件外,该文件仅包含以下内容:

junit-4.8.1.jar
jurt-3.2.1.jar
log4j-1.2.16.jar
mockito-all-1.8.5.jar

我需要以以下形式创建用冒号分隔的类路径变量:

CLASSPATH=/path/to/project/dir/lib/junit-4.8.1.jar:/path/to/project/dir/lib/jurt-3.2.1.jar:/path/to/project/dir/lib/log4j-1.2.16.jar:/path/to/project/dir/lib/mockito-all-1.8.5.jar

几乎可以表达我正在寻找的逻辑的一些伪代码大致如下:

for( each file in directory ) {
   classpath = classpath + ":" + LIB + file.name
}

通过bash脚本完成此操作的 简单 方法是什么?


问题答案:

新答案
(2012年10月)

无需手动构建类路径列表。Java支持包含jar文件的目录的便捷通配符语法。

java -cp "$LIB/*"

(请注意,* 引号)。

来自的解释man java

为了特别方便,包含*的基本名称的类路径元素被认为等效于指定目录中所有带有扩展名.jar.JAR(Java程序无法区分两次调用之间的区别)的文件列表。

例如,如果目录foo包含a.jarb.JAR,则将类路径元素foo/*扩展为A.jar:b.JAR,除非未指定jar文件的顺序。列表中包括指定目录中的所有jar文件,甚至是隐藏的jar文件。仅由组成的类路径条目*扩展为当前目录中所有jar文件的列表。的CLASSPATH环境变量,其中所定义,将类似地扩展。任何类路径通配符扩展都会在Java虚拟机启动之前发生-
除查询环境外,任何Java程序都不会看到未扩展的通配符。

旧答案

简单但不完美的解决方案

CLASSPATH=$(echo "$LIB"/*.jar | tr ' ' ':')

有一个小缺陷,那就是不能正确处理带有空格的文件名。如果那很重要,请尝试以下稍微复杂一些的版本:

更好

CLASSPATH=$(find "$LIB" -name '*.jar' -printf '%p:' | sed 's/:$//')

这仅在您的find命令支持时才有效-printf(如GNU find那样)。

如果没有findMac OS X上的GNU ,则可以xargs改用:

CLASSPATH=$(find "." -name '*.jar' | xargs echo | tr ' ' ':')

最好?

另一种(更奇怪的)方法是更改​​字段分隔符变量$IFS。这看起来很奇怪,但是在所有文件名下都表现良好,并且仅使用shell内置程序。

CLASSPATH=$(JARS=("$LIB"/*.jar); IFS=:; echo "${JARS[*]}")

说明:

  1. JARS 设置为文件名数组。
  2. IFS更改为:
  3. 回显该数组,并将$IFS其用作数组条目之间的分隔符。表示文件名之间用冒号打印。

所有这些都是在子Shell中完成的,因此对的更改$IFS不是永久的(这将是baaaad)。



 类似资料:
  • 问题内容: 我想在当前位置的子目录之间进行迭代,并分别gzip每个文件。为了在目录中压缩文件,我使用 但这仅适用于当前目录,而不适用于当前目录的子目录。如何重写以上语句,以便也将所有子目录中的文件压缩? 问题答案: 不需要循环或除和以外的任何东西: 这将查找当前目录中及其下所有名称不以扩展名结尾的常规文件(即,所有尚未压缩的文件)。它分别在每个文件上调用。 编辑的基础上,从评论: 花括号()替换为

  • 有没有办法使用来获取JAR目录中的“子资源”列表? 但我却找不到办法获得“孩子”资源。

  • 可能重复: gzip一组目录并创建tar压缩文件 这篇文章描述了如何在一个目录结构中分别gzip每个文件。然而,我需要做一些稍微不同的事情。我需要为某个目录下的所有文件生成一个大的gzip文件。我还需要能够为压缩文件(例如files.gz)指定输出文件名,并覆盖旧的压缩文件(如果已经存在)。

  • 问题内容: 如果要在中创建文件,可以执行以下操作: 另外,我想用于创建文件。那我该怎么办呢?由于某种原因,该文件未在正确的目录中创建。 问题答案: 最好的方法是:

  • 所以我开始使用Neovim /Spacevim,它真是太棒了! 我仍然在习惯一切,因为我以前从未使用过Vim或类似的东西。 我的问题围绕着在当前打开的项目的所有文件中搜索特定文本。 我正在使用文件管理器,我想知道如何在项目中的所有文件中搜索特定字符串。就像如果我想在当前打开的文件夹/目录中搜索,我该如何去做?主要目标是列出包含此搜索字符串的所有文件。 我已经安装了(以及),但在搜索所有文件中的特定

  • 问题内容: 在PHP中可以包含脚本目录吗? 即代替: 是否有类似的东西: 似乎找不到找到针对特定类的大约10个子类的集合的好方法。 问题答案: