Как использовать команду mv в Python с подпроцессом

у меня много файлов в /home/somedir/subdir/, и я пытаюсь переместить их все в /home/somedir программно.

сейчас у меня есть это:

subprocess.call(["mv", "/home/somedir/subdir/*", "somedir/"])

но это дает мне эту ошибку:

mv: cannot stat `/home/somedir/subdir/*': No such file or directory

Я знаю, что он существует, потому что, когда я набираю команду MV вручную, используя ту же команду, что и скрипт, он отлично работает.

3 ответов


если вы вызываете подпроцесс таким образом:

subprocess.call(["mv", "/home/somedir/subdir/*", "somedir/"])

ты даешь аргумент /home/somedir/subdir/* до С . т. е. вы на самом деле пытаетесь переместить .

subprocess.call("mv /home/somedir/subdir/* somedir/", shell=True)

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

Nota Bene при использовании shell=True аргумент вам нужно изменить список аргументов в строку, которая будет передана ракушка.

подсказка: вы также можете использовать os.rename() или shutil.move() функции, наряду с os.path.walk() или os.listdir() переместить файлы в пункт назначения в более подходящие для Python путь.


вы можете решить эту проблему, добавив параметр shell=True, чтобы учесть подстановочные знаки в вашем случае (и поэтому напишите команду напрямую, без какого-либо списка):

subprocess.call("mv /home/somedir/subdir/* somedir/", shell=True)

без него аргумент непосредственно передается mv команда со звездочкой. Это задание оболочки для возврата всех файлов, которые соответствуют шаблону в целом.


вы используете оболочку globbing *, и ожидал mv команда, чтобы узнать, что это значит. Вы можете получить ту же ошибку из командной оболочки следующим образом:

$ mv 'somedir/subdir/*' ...

обратите внимание на кавычки. Оболочка обычно делает glob-matching on * для вас, но команды не делают этого в своих командных строках; даже оболочка не делает. Существует функция библиотеки C с именем fnmatch это делает Shell-style globbing для вас, который каждый язык программирования более или менее копирует. Возможно, у него даже есть такое же имя в Python. Или в нем может быть слово "Глоб", я не помню.