Как я могу заставить эту команду Java действовать на каждый файл, найденный командой находки?

Вы хотите, чтобы оболочка применила замены переменных, что означает, что текст шаблона должен быть прочитан самой оболочкой как часть команды, но шаблон является также многострочным текстом, таким образом, это немного хитро для вхождения в ориентированную на строку обработку обычно сделанного командами UNIX.

Один подход должен был бы использовать здесь-документы удара (все команды, показанные, как введено при приглашении оболочки):

  1. создайте шаблонный файл:

    $ cat template.txt
    Hi, $NAME
    
    Welcome to $PLACE
    
  2. экспортируйте переменные, которыми нужно заменить в тексте шаблона:

    $ export NAME=Bob
    $ export PLACE='unix&linux'
    
  3. создайте переменную оболочки, которая содержит единственную "новую строку" \n символ; в ударе самый легкий путь состоит в том, чтобы просто открыть строку, ввести новую строку и закрыть его:

    $ newline='
    > '
    
  4. наконец, назовите удар, чтобы сделать замену:

    $ bash -c "cat <<__EOF__${newline}$(cat template.txt)${newline}__EOF__"
    Hi, Bob
    
    Welcome to unix&linux
    

Почему это работает? Давайте вскроем противоречия в нем от нижней части: Вы просите колотить для выполнения команды ( -c опция), но подстановка переменных ${newline} и расширение команды $(cat ...) произойдите в родительской оболочке прежде bash -c ... на самом деле выполняется. Таким образом, результат - это bash -c видит командную строку, которая встраивает новые строки и целый текст шаблона. Это - как будто Вы ввели следующее при подсказке удара:

cat <<__EOF__
...contents of template.txt...
__EOF__

Также обратите внимание, что подставляемые переменные должны быть экспортированы, так как переменные присвоены в родительской оболочке, но это - "дочерний" удар, который делает замену.

Обратите внимание, однако, что этот подход может легко привести к заключению в кавычки проблем: так как текст шаблона интерпретируется оболочкой удара, обратные галочки расширены, который мог бы привести к командам, выполняемым в Вашей системе.

1
08.04.2012, 10:04
1 ответ

То, что Вы обеспечили, кажется, корректно; можно проверить это java вызывается правильно путем вставки echo в команду:

find $DIR -type f -name '*.html' -exec echo java -jar $BASEDIR/Upload/htmlcompressor-1.5.3.jar --remove-intertag-spaces {} \;

(принятие правильно POSIX совместимая система, которая имеет невстроенные версии оболочки builtins по стандарту PATH).

Кроме того, Вы могли бы хотеть выполнить одну из получающихся команд вручную, чтобы проверить, что она работает правильно.

2
27.01.2020, 23:39
  • 1
    О, по-видимому, я должен установить параметр, -o, для определения выходного файла иначе это просто работает, не сохраняя изменения. Так... мое плохое при не наблюдении этого в documenation. Однако, как я добираюсь find управлять для присоединения правильного входного файла к параметру? Сама команда должна быть java -jar htmlcompressor.jar -o output.html input.html. Я хочу, чтобы ввод и вывод был тем же, таким образом: java -jar htmlcompressor.jar -o same.html same.html. Как я добираюсь find команда, чтобы сделать это? –  Questioner 08.04.2012, 10:38
  • 2
    Это на самом деле проложит себе путь? (Это стоит проверить; некоторые программы при выяснении сделать это уничтожат свой вход, прежде чем у них будет шанс считать его.), Если это будет, просто указывая {} везде, где это необходимо, будет работать. –  geekosaur 08.04.2012, 10:41
  • 3
    Да, это работает! –  Questioner 08.04.2012, 10:52

Теги

Похожие вопросы