переименование файлов с помощью bash, уточнение команд - PullRequest
1 голос
/ 16 октября 2011

После этого вопроса Рекурсивное переименование файлов с использованием find и sed Я нашел это решение для переименования файлов с использованием find, но я не могу полностью понять последнюю часть

find . -name '*_test.rb' -exec bash -c 'echo mv $1 ${1/test.rb/spec.rb}' _ {} \;

МожетКто-нибудь объяснит значение символов '_ {}',?Я предполагаю, что это своего рода сопоставление аргументов из среды, но ...

Некоторые уточнения будут приветствоваться.

1 Ответ

1 голос
/ 16 октября 2011
-exec command ;

Строка `{} 'заменяется текущим именем обрабатываемого файла.Рассмотрим следующее:

% find . -type f
./file1
./file2
./file3
./file4
./file5
% find . -type f -exec sh -c 'printf "arg -> %s\n" "$0"' {} \;
arg -> ./file1
arg -> ./file2
arg -> ./file3
arg -> ./file4
arg -> ./file5

Но здесь мы выполняем sh -c ... для каждого найденного файла.Также обратите внимание, что имя файла передается в оболочку как $ 0 (не $ 1 ).

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

% find . -type f -exec sh -c 'printf "arg -> %s\n" "$@"' {} +
arg -> ./file2
arg -> ./file3
arg -> ./file4
arg -> ./file5

Обратите внимание на синтаксис {} + (против {} \;).Из найдите справочных страниц:

-exec command {} +
          This variant of the -exec action runs the specified command on the selected files, but the command line
          is built by appending each selected file name at the end; the total number of invocations of  the  com-
          mand  will  be  much less than the number of matched files.  The command line is built in much the same
          way that xargs builds its command lines.

Но, как вы заметили, первый файл отсутствует (потому что $ @ содержит все параметры, кроме$ 0).Вот почему нам нужно установить наши $ 0 вручную, чтобы правильно обработать все аргументы:

% find . -type f -exec sh -c 'printf "arg -> %s\n" "$@"' put_whatever_you_want_here {} +
arg -> ./file1
arg -> ./file2
arg -> ./file3
arg -> ./file4
arg -> ./file5

В некоторых ситуациях вам может потребоваться установить $ 0 на что-то значимое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...