MaxLevs
@MaxLevs

Почему связыка find/xargs срабатывает только на одном файле?

Добрый день!
После некоторого времени вычитки книг fb2 от одного переводчика выделил ряд regexp для исправления некоторых моментов. Юзать их поочередно да ещё и для каждого оставшегося файла как-то долго, поэтому написал простеньких скрипт на Python (собственно, сразу после того, как выучил некоторые основы).

Вот, что вышло:
- csetfix.sh
enconv -x UTF-8 $1
python bfix.py $1

- bfix.py
# -*- coding: utf-8 -*-
import re
import sys

if len(sys.argv) < 2:
	exit(1)

reg = [
	{'find':r'windows-1251', 'replace':r'utf-8'},
	{'find':r'-нить', 'replace':r'-нибудь'},
	{'find':r'кол-в', 'replace':r'количеств'},
	{'find':r'-же', 'replace':r' же'},
	{'find':r'так же', 'replace':r'также'},
	{'find':r'Однако,', 'replace':r'Однако'},
	{'find':r'Высочество', 'replace':r'Величество'},
	{'find':r'Глава №?(\d+)\.? ', 'replace':r'Глава \1: '},
	{'find':r'(?<=<body>)\s+<title>[\s\S]+?</title>', 'replace':r''},
	{'find':r'– -{30,43},', 'replace':r' ================================ '},
	{'find':r'<p>\s+', 'replace':r'<p>'},
	{'find':r'\s+</p>', 'replace':r'</p>'},
	{'find':r'<emphasis>\s+', 'replace':r'<emphasis>'},
	{'find':r'\s+</emphasis>', 'replace':r'</emphasis>'},
	{'find':r'</emphasis>\s*<emphasis>', 'replace':r' '},
	{'find':r'<strong>\s+', 'replace':r'<strong>'},
	{'find':r'\s+</strong>', 'replace':r'</strong>'},
	{'find':r'</strong>\s*<strong>', 'replace':r' '},
	{'find':r'<strong></strong>', 'replace':r''},
	{'find':r'<emphasis></emphasis>', 'replace':r''},
	{'find':r'<p></p>', 'replace':r''},
	{'find':r'( –)(?= (?:(?:потому )?что(?:бы)?|если|то|а|да|и|или|однако|но) )', 'replace':r','},
	{'find':r'\.</strong>', 'replace':r'</strong>'},
	{'find':r':</strong>([^\s<])', 'replace':r':</strong> \1'},
	{'find':r'(= </p>\s+<p><strong>)– ', 'replace':r'\1'},
	{'find':r'\s+(\.|,|!|\?)', 'replace':r'\1'},
	{'find':r'\n+', 'replace':r'\n'}
]

file = open(sys.argv[1], "r")
result = ""
for line in file.readlines():
	result = result+line
file.close()
for i in range(0,len(reg)):
	result = re.sub(reg[i]['find'], reg[i]['replace'], result)
result = re.split("\n+", result)
file2 = open(sys.argv[1], "w")
for line in result:
	file2.write(line+'\n')
file2.close()


Однако при запуске
find -type f -name "*.fb2" | sort | xargs python bfix.py

изменяется только тот файл, путь к которму find выдает первым..

С чем это связано? Как решить?
  • Вопрос задан
  • 192 просмотра
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Ваш скрипт на питоне обрабатывает единстенный файл-параметр. xargs без дополнительных параметров вызывает то что ему дали с наибольшим возможным количеством параметров. Чтобы эта связка работала пишите так:

find -type f -name "*.fb2" | sort | xargs -n1 python bfix.py
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы