将罐子收集到 tar 没有目录

Collect jars into a tar without directory

我有一个大型项目,它在类似于 project/subproject/target/subproject.jar 的路径中创建了大量的 jar。我想发出一个命令将所有 jar 收集到一个压缩的 tar 中,但没有目录。到目前为止我想出的命令是:find project -name \*.jar -exec tar -rvf Collectors.tar.gz -C $(dirname {}) $(basename {}) \; 但这并不像我预期的那样有效,目录仍然存在。

有没有人知道如何解决这个问题?

您的命令非常接近,但问题是 Bash 正在执行 $(dirname {})$(basename {}) 执行 find;所以你的命令扩展为:

find project -name \*.jar -exec tar -rvf Collectors.tar.gz -C . {} \;

其中 -C . 是空操作,{} 只是扩展到完整的相对目录+文件名。

解决此类问题的一种通用方法是将 -exec 的参数包装在 Bash 一行中,这样您就可以为每个人调用 Bash文件,让它在合适的时间执行dirnamebasename

find project -name \*.jar -exec bash -c 'tar -rvf Collectors.tar.gz -C "$(dirname "")" "$(basename "")"' '' '{}' \;

但是,在您的具体情况下,我会向您指出 find-execdir 操作,它与 -exec 相同,只是 cd首先进入文件目录。所以你可以简单地写:

find project -name '*.jar' -execdir tar -rvf "$PWD/Collectors.tar.gz" '{}' \;

(注意$PWD部分,这是为了确保你写到current目录下的Collectors.tar.gz,而不是在目录下find -execdircd 进入。)