как получить обратную экранированную экранированную версию выражения glob в python3 - PullRequest
0 голосов
/ 25 сентября 2019

Я строю команды в Python, включая выражение glob, которое также содержит пробельные символы.

Я прочитал, что предложенный способ использует shlex.quote , но он работает только для реальныхвосстановленные пути, потому что включение выражения в ' или " также блокирует расширение оболочки glob .

Простейший возможный пример:

touch 'a file.txt'
ls 'a file.*' # this gives an error because the glob is not resolved
# shlex.quote achieves the same result
python3 -c "import os; from shlex import quote; os.system('ls '+quote('a file.*'))"    
ls a\ file.* # this is what I need

Я знаю, чтоЯ могу использовать любую технику замены для замены пробелов ' ' на '\ ' в этой строке (например, регулярное выражение для имени одной), но я подумал, что если уже существует подходящая функция, я должен сначала искать ее, а не писать свою собственнуюкод ...

Реальный случай

Составляемые мной команды должны влиять на несколько файлов, путь к которым похож (подумайте об этом, разделенных подчеркиванием '_'):

dir/WrongID_Another ID With Spaces_other-stuff-with-hyphens.bmp

Я хочу получить такие команды, как:

rename "s/^WrongID_/RightId_/" dir/WrongID_Another\ ID\ With\ Spaces_*.*

... где dir, WrongID, Another ID With Spaces, RightID, считываются из таблицы

Многие такие команды написаны наодин файл, скрипт, который я потом передам в bash.

1 Ответ

0 голосов
/ 25 сентября 2019

Возможно, вы ищете

while read -p dir wrong rest right; do
    rename "s/^${wrong}_/${right}_/" "$dir/${wrong}_${rest}_"*.*
done <<\____
    one    few     other   many
    two    theyre  stuff   there
    three  grammer correct grammar
____

фигурные скобки необходимы для устранения неоднозначности ${wrong}_ (переменная wrong с последующим подчеркиванием) от $wrong_ (переменная wrong_ с подчеркиванием).

Я не думаю, что Python здесь необходим или полезен, хотя, как вы обнаружили, shlex.quote() обеспечивает требуемую функциональность.Если вы хотите использовать это в Python, лучше избегать оболочки полностью.

import subprocess
import glob

for dir, wrong, rest, right in (
        ('one',   'few',     'other',   'many'),
        ('two',   'theyre',  'stuff',   'there'),
        ('three', 'grammer', 'correct', 'grammar')):
    subprocess.run(['rename', 's/^{0}_/{1}_/'.format(wrong, right)] +
        glob.glob('{0}/{1}_{2}_*.*'.format(dir, wrong, rest))])
...