将罐子收集到 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文件,让它在合适的时间执行dirname
和basename
:
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 -execdir
会 cd
进入。)
我有一个大型项目,它在类似于 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文件,让它在合适的时间执行dirname
和basename
:
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 -execdir
会 cd
进入。)