将jar收集到没有目录

时间:2016-07-28 19:37:28

标签: bash find tar

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

有没有人对如何解决此问题有任何想法?

1 个答案:

答案 0 :(得分:1)

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

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

其中-C .是无操作,而{}只是扩展为完整的相对目录+ filename。

修复此类事情的一种通用方法是将参数包装在Bash一行中的-exec中,因此您为每个单独的文件调用Bash,并让它执行{{1 }}和dirname在合适的时间:

basename

但是,在您的具体情况下,我会指向您find project -name \*.jar -exec bash -c 'tar -rvf Collectors.tar.gz -C "$(dirname "$1")" "$(basename "$1")"' '' '{}' \; 的{​​{1}}操作,该操作与find相同,但-execdir除外-exec 1}}首先进入文件目录。所以你可以简单地写一下:

cd

(注意find project -name '*.jar' -execdir tar -rvf "$PWD/Collectors.tar.gz" '{}' \; 部分,这是为了确保您写入当前目录中的$PWD,而不是Collectors.tar.gz目录中的find -execdircd转化为。)