Ваша команда довольно близко, но проблема заключается в том, что 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 "$1")" "$(basename "$1")"' '' '{}' \;
в вашем конкретном случае, однако, я укажу вам «-execdir
действия s, которая является такой же, как -exec
за исключением того, что он cd
» s find
в директории файла первой. Таким образом, вы можете просто написать:
find project -name '*.jar' -execdir tar -rvf "$PWD/Collectors.tar.gz" '{}' \;
(Обратите внимание, что $PWD
часть, которая, чтобы убедиться, что вы пишете в Collectors.tar.gz
в каталоге тока, а не в каталоге, find -execdir
воли cd
в.)
Это ближе, но создает несколько смол. Один в каждом каталоге. Мне нужна одна смола со всеми баночками. – brostone51
Упс, га, дух, исправит, извините. – ruakh