在Python子进程中使用exec的find命令会出现错误

6
我正在尝试使用subprocess模块(python)执行以下命令。
/usr/bin/find <filepath> -maxdepth 1 -type f -iname "<pattern>" -exec basename {} \;

但是,它会出现以下错误:
/usr/bin/find: missing argument to `-exec'

我猜想这与转义一些字符有关。但是不知道如何克服这个问题。任何帮助都将不胜感激。谢谢。

7
请提供启动子进程的代码行。 - wim
3个回答

15

另一个问题的答案有所帮助: https://dev59.com/eG7Xa4cB1Zd3GeqPuNEp#15035344

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
另外一个提示:使用语法r'bla'可以让反斜杠无需加引号即可使用:
r'... -exec basename {} \;'

提供更好的可读性。


-2

记得需要转义双引号",并且在分号;之前使用反斜杠\进行转义。

你的命令可能看起来像这样:

p1 = subprocess.Popen(["/usr/bin/find", "<filepath> -maxdepth 1 -type f -iname \"<pattern>\" -exec basename {} \\;"])
p1.communicate()

如果 OP 在字符串中使用单引号('),则无需转义双引号。 - Some programmer dude
谢谢。在整个命令字符串周围加上单引号起作用了。 - shruthi
尽管你成功了,@shruthi能否提供原始代码?以及你是如何修复它的? - isaaclw
1
还要注意:这并不起作用。它会将第二个参数整个解释为路径(从<filepath>到 \;),这不是您所期望或想要的。 - isaaclw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接