Unescaping имена файлов, сгенерированные ls -R - PullRequest
3 голосов
/ 01 января 2012

У меня есть текстовый файл, содержащий выходные данные рекурсивного списка каталогов, который обычно выглядит следующим образом:

./subfolder/something with spaces:
something\ with\ spaces.txt*
something\ with\ spaces.dat*

./subfolder/yet another thing:
yet\ another\ thing.txt*
yet\ another\ thing.dat*

Мне нужно получить список полных путей к каждому файлу .txt:

./subfolder/something with spaces/something with spaces.txt
./subfolder/yet another thing/yet another thing.txt

У меня почти есть решение для этого, но каково лучшее решение для удаления имен файлов в Python?Я не знаю точно, какие символы ls -R экранировали (хотя пробел и = два таких символа).У меня нет доступа и к диску, содержащему эти файлы, поэтому, к сожалению, использование лучшей команды для получения списка исключено.

1 Ответ

1 голос
/ 01 января 2012

Я не уверен, есть ли встроенное для этого, но можно использовать простое регулярное выражение.

re.sub(r'(?<!\\)\\', '', filename)

Это удалит все обратные косые черты (кроме тех, которые следуют за другой обратной косой чертой).Это похоже на поведение при попытке echo этих значений на терминале (я проверял это только в bash).

bash-3.2$ echo foo\\bar
foo\bar
bash-3.2$ echo foo\ bar
foo bar
bash-3.2$ echo foo\=bar
foo=bar

Вот полный пример Python:

import re

def unescape(filename):
    return re.sub(r'(?<!\\)\\', '', filename)

print unescape(r'foo\ bar')
print unescape(r'foo\=bar')
print unescape(r'foo\\bar')

Вывод:

foo bar
foo=bar
foo\bar
...