Использование базового имени для имени выходного файла в java

У меня есть рекурсивная структура каталогов, содержащих некоторые foo файлы, которые я хочу преобразовать в bar файлы с помощью таблицы стилей XSLT 1.0. У меня есть:

dir
|-- subdir
|   |-- file1.foo
|   |-- file2.foo
|   |-- file3.foo

И я хочу получить:

dir
|-- subdir
|   |-- file1.foo
|   |-- file1.bar
|   |-- file2.foo
|   |-- file2.bar
|   |-- file3.foo
|   |-- file3.bar

Чтобы записать базовое имя файлов без расширения, я попытался:

$ find . -type f -exec java -jar C:/saxon6-5-5/saxon.jar -o $(basename {} .foo).bar {} stylesheet.xsl \;

а также

$ find . -type f -exec java -jar C:/saxon6-5-5/saxon.jar -o `basename {} .foo`.bar {} stylesheet.xsl \;

Оба с одинаковым результатом:

dir
|-- subdir
|   |-- file1.foo
|   |-- file1.foo.bar
|   |-- file2.foo
|   |-- file2.foo.bar
|   |-- file3.foo
|   |-- file3.foo.bar

Похоже, команда basename не работает. Что я делаю не так?


person msoutopico    schedule 06.06.2015    source источник
comment
Спасибо, Джаян. Я видел эту страницу. Насколько я понимаю, вы предлагаете использовать -exec sh -c в моем единственном лайнере. Однако я не знаю, как совместить sh -c с java -jar.   -  person msoutopico    schedule 06.06.2015
comment
Не вдаваясь в подробности вопроса, я бы предложил GNU Parallel, который исключительно хорош в такого рода задачи.   -  person 4ae1e1    schedule 08.06.2015
comment
Спасибо, 4ae1e1. Действительно, кажется, что Parallel может помочь косвенно. Я работаю над Windows, поэтому мне нужно будет найти порт или переключиться на Linux для этой задачи.   -  person msoutopico    schedule 09.06.2015


Ответы (1)


Вот подход zsh, поскольку он помечен как таковой.

for f in **/*.foo(.); print -- java ... -o $f:r.bar $f

Удалите print --, когда убедитесь, что он хорошо выглядит.

(.) говорит только о файлах. :r говорит об удалении расширения .foo. Полезно запомнить манипуляторы пути как "erth" для extension / remove / tail / head.

Также есть zmv с опцией -p для вызова вашей java-команды.

person Micah Elliott    schedule 11.06.2015
comment
Вроде работает, спасибо. Я не пробовал в других оболочках, но понимаю, что это может работать только в zsh. Для записи мой код for f in **/*.foo(.); java -jar C:/Apps/saxon6-5-5/saxon.jar -o $f:r.bar $f stylesheet.xsl. - person msoutopico; 12.06.2015