2016-07-28 3 views
1

У меня есть большой проект, который создает большое количество банок на пути, подобном project/subproject/target/subproject.jar. Я хочу сделать команду собрать все банки в один сжатый tar, но без каталогов. Команда, которую я привел до сих пор: find project -name \*.jar -exec tar -rvf Collectors.tar.gz -C $(dirname {}) $(basename {}) \;, но это не совсем так, как я намереваюсь, каталоги все еще существуют.Соберите банки в tar без каталога

Есть ли у кого-нибудь идеи по устранению этой проблемы?

ответ

1

Ваша команда довольно близко, но проблема заключается в том, что 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 в.)

+0

Это ближе, но создает несколько смол. Один в каждом каталоге. Мне нужна одна смола со всеми баночками. – brostone51

+0

Упс, га, дух, исправит, извините. – ruakh

Смежные вопросы