Выполнить команду оболочки в Python: «Плохая замена» - PullRequest
1 голос
/ 29 апреля 2020

Я хочу пакетное переименование файлов в нескольких каталогах

Выполнение for file in *.jpg; do mv "$file" "${file::19}.jpg";done делает это в одном каталоге.

Теперь я хотел бы l oop по нескольким подобным.

import os
folder = ['/dir_1','/dir_2']

for dir_ in folder:
    print(dir_)
    os.chdir(dir_)
    os.system('for file in *.jpg; do mv "$file" "${file::19}.jpg";done')

Однако я получаю ошибку sh: 1: Bad substitution

Может кто-нибудь показать мне, как сделать это?

1 Ответ

2 голосов
/ 29 апреля 2020

Расширение этого параметра называется Substring Expansion и является расширением Bash. Он работает, когда вы набираете его в командной строке, потому что вы используете Bash в качестве интерактивной оболочки, но может не работать, когда вы используете os.system, потому что он использует /bin/sh, который может быть не Bash, но некоторый меньший POSIX-совместимый оболочка типа dash. Вы должны использовать awk, чтобы сделать то, что вы хотите, как описано здесь вот так:

os.system('for file in *.jpg; do mv "$file" "$(echo $file | awk  \'{ string=substr($0, 0, 19); print string; }\')".jpg; done')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...