Bash find: изменение совпадающего имени для использования в -exec - PullRequest
1 голос
/ 12 ноября 2011

Я пишу сценарий развертывания, и мне нужно запустить менее компилятор для всех файлов .less в каталоге. Это легко сделать с помощью следующей команды поиска:

find -name "*.less" -exec plessc {} {}.css \;

После выполнения этой команды в папке с файлом с именем main.less у меня остается файл с именем main.less.css, но я хочу, чтобы он был main.css.

Я знаю, что могу легко удалить лишнюю часть полученных файлов с помощью этой команды: rename 's/\.less//' *.css, но я надеюсь узнать что-то новое об использовании -exec.

Можно ли изменить имя файла, который соответствует, при использовании его в параметре -exec?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 13 ноября 2011

Ваша команда find использует несколько нестандартных расширений GNU:

  • Вы не указываете, где искать, это ошибка в POSIX, но GNU find выбирает текущий каталог в этом случае
  • Вы используете неизолированный {}, POSIX find не расширяет его в этом случае.

Вот один вкладыш, который должен работать с большинством реализаций поиска и исправить ваше двойное расширениепроблема:

find . -name "*.less" -exec sh -c "plessc \$0 \$(dirname \$0)/\$(basename \$0 less)css" {} \;

В Solaris 10 и более старых версиях sh -c следует заменить на ksh -c, если PATH не соответствует POSIX.

2 голосов
/ 12 ноября 2011

Нет, это невозможно сделать напрямую. Вы можете использовать {} только для прямой вставки полного имени файла. Тем не менее, в exec, вы МОЖЕТЕ вставить другие вещи, как awk. Или вы можете перенаправить вывод в другую программу через каналы.

со страницы find man:

   -exec command ;
          Execute command; true if 0 status is  returned.   All  following
          arguments to find are taken to be arguments to the command until
          an argument consisting of `;' is encountered.  The  string  `{}'
          is  replaced by the current file name being processed everywhere
          it occurs in the arguments to the command, not just in arguments
          where  it  is alone, as in some versions of find.  Both of these
          constructions might need to be escaped (with a `\') or quoted to
          protect  them  from  expansion  by  the shell.  See the EXAMPLES
          section  for  examples  of  the  use  of  the -exec option.  The 
          specified command is run once for each matched file. The command 
          is executed in the starting directory.   There  are  unavoidable
          security  problems  surrounding  use  of  the -exec action;  you
          should use the -execdir option instead.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...