이것은 주로 주제와 관련이 없지만 사용할 수 있습니다.
find -maxdepth 1 -type f -name '*.txt' | xargs python -c '
import fileinput
for line in fileinput.input(inplace=True):
print line.replace("blah", "blee"),
'
여기서 (이상 ... xargs ... -I {} ... sed ...
) 의 주요 이점 은 속도입니다. sed
1000 만 번 호출하지 마십시오 . 파이썬이 상대적으로 느리기 때문에 파이썬 사용을 피할 수 있다면 여전히 더 빠를 것이므로 perl 이이 작업에 더 나은 선택 일 수 있습니다. 펄을 사용하여 동등하게 편리하게 수행하는 방법을 모르겠습니다.
이것이 작동하는 방식 xargs
은 단일 명령 줄에 맞는만큼 많은 인수로 Python을 호출하고 인수가 부족할 때까지 계속합니다 (에서 제공 ls -f *.txt
). 각 호출에 대한 인수의 수는 파일 이름의 길이와 다른 것들에 따라 다릅니다. 이 fileinput.input
함수는 각 호출의 인수에 이름이 지정된 파일에서 연속적인 행을 생성하며, inplace
옵션은 출력을 마술처럼 "잡아서"각 행을 바꾸는 데 사용하도록 지시합니다.
파이썬의 문자열 replace
메소드는 정규 표현식을 사용하지 않습니다. 필요한 경우을 import re
사용해야 print re.sub(line, "blah", "blee")
합니다. 그것들은 Perl과 호환되는 RegExps입니다 sed -r
.
편집하다
주석에서 akira가 언급했듯이, glob ( ls -f *.txt
)를 사용하는 원래 버전은 glob find
( bash
) 자체에 의해 처리되므로 명령 대신에 glob ( )를 사용 합니다. 이것은 명령이 실행되기 전에 천만 개의 파일 이름이 명령 행으로 대체됨을 의미합니다. 이것은 명령의 인수 목록의 최대 크기를 초과하도록 보장됩니다. 이것에 xargs --show-limits
대한 시스템 특정 정보에 사용할 수 있습니다 .
인수 목록의 최대 크기도 다음과 같이 고려됩니다. xargs
,이 한계에 따라 파이썬의 각 호출에 전달되는 인수 수를 제한합니다. xargs
여전히 파이썬을 꽤 많이 호출해야하기 때문에 os.path.walk
파일 목록을 얻는 데 사용 하는 akira의 제안 은 아마도 시간을 절약 할 것입니다.
sed
각 파일에 대한 호출 을 피할 수 있으면 더 빠릅니다 . 일련의 파일을 열고, 편집하고, 저장하고 닫는 방법이 있는지 확실하지 않습니다sed
. 속도가 필수적이라면 펄이나 파이썬과 같은 다른 프로그램을 사용하는 것이 좋습니다.