我有一个大型项目,在类似于project/subproject/target/subproject.jar
的路径中创建了大量的jar。我想创建一个命令来将所有jar收集到一个压缩的tar中,但没有目录。到目前为止我提出的命令是:find project -name \*.jar -exec tar -rvf Collectors.tar.gz -C $(dirname {}) $(basename {}) \;
但是这并不像我想的那样工作,目录仍在那里。
有没有人对如何解决此问题有任何想法?
答案 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 -execdir
将cd
转化为。)