Команда find с exec в подпроцессе python выдает ошибку - PullRequest
2 голосов
/ 21 марта 2012

Я пытаюсь выполнить следующую команду с помощью модуля подпроцесса (python)

/usr/bin/find <filepath> -maxdepth 1 -type f -iname "<pattern>" -exec basename {} \;

Но выдает следующую ошибку:

/usr/bin/find: missing argument to `-exec'

Я предполагаю, что это связано с экранированием некоторых персонажей. Но не понимаю, как с этим справиться.

Любая помощь приветствуется. Спасибо.

Ответы [ 3 ]

10 голосов
/ 27 апреля 2013

Помог ответ на другой вопрос: https://stackoverflow.com/a/15035344/971529

import subprocess

subprocess.Popen(('find', '/tmp/mount', '-type', 'f',
              '-name', '*.rpmsave', '-exec', 'rm', '-f', '{}', ';'))

Я не мог понять, что точку с запятой не нужно экранировать, поскольку обычно точка с запятойинтерпретируется bash и требует экранирования.

В bash это эквивалентное значение:

find /tmp/mount -type f -name "*.rpmsave" -exec rm -f {} \;
0 голосов
/ 21 марта 2012

Еще один совет: использование синтаксиса r'bla 'позволяет использовать обратную косую черту без кавычек:

r'... -exec basename {} \;'

Обеспечивает лучшую читаемость.

0 голосов
/ 21 марта 2012

запомните, экранирование " необходимо, а также экранирование \, используемое до того, как ; также потребуется

ваша команда может выглядеть примерно так:

p1 = subprocess.Popen(["/usr/bin/find", "<filepath> -maxdepth 1 -type f -iname \"<pattern>\" -exec basename {} \\;"])
p1.communicate()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...