2012-01-24 4 views
5

인코딩 iso-8859-1이있는 모든 텍스트 파일을 찾고이를 UTF-8로 변환하려고합니다. {}가 재 지정 후 발생하기 때문에xargs : 리디렉션 후의 변수 대체

find . -name '*.txt' | xargs grep 'iso-8859-1' | cut -d ':' -f1 | 
xargs iconv -f ISO-8859-1 -t UTF-8 {} > {}.converted 

(명백한) 문제가 마지막 변수 치환이 작동하지 않습니다, 그리고 xargs에 속하지 않는 나의 시도는 지금까지입니다. 있는 그대로 a.txt.converted, b.txt.converted 등이 아닌 {}.converted이라는 파일 하나만 얻습니다. 어떻게하면됩니까?

참고 : Cygwin에서 iconv가 -o을 지원하지 않는 것으로 보입니다.

+0

[관련 질문] (http://stackoverflow.com/q/845863/183066)을 참조하십시오. – jcollado

+0

어떤 대답을 받아야할지 모르겠습니다. e.dan과 glenn의 답변은 가장 실용적이지만 Ole Tanges는 가장 심미적으로 즐겁습니다. chorobas도 꽤 좋습니다. 그것에 대해 생각해야합니다. –

답변

3

당신이 GNU 병렬 http://www.gnu.org/software/parallel/ 설치 당신이 할 수있는 경우 :

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel 
chmod 755 parallel 
cp parallel sem 

:

find . -name '*.txt' | parallel grep -il iso-8859-1 | parallel iconv -f ISO-8859-1 -t UTF-8 {} \> {}.converted 

당신은에 의해 단순히 GNU 병렬를 설치할 수 있습니다 자세한 내용은 GNU Parallel의 소개 비디오를 확인하십시오. https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

1

방법에 대한 for 루프 같은 : 파일 하나도 없다는 가정하에

for file in `find . -name '*.txt' | xargs grep 'iso-8859-1' | cut -d ':' -f1`; do 
    iconv -f ISO-8859-1 -t UTF-8 $file > $file.converted 
done 
+0

당신의 솔루션은 어떻게 파일을 처리 할 것인가? '내 동생의 12 레코드 : Listed a-> z.txt'? –

1

는 이름에서 개행 문자가, 당신은 GNU 찾을 수 있다고 가정하고 xargs를 :: grep -l

find . -name '*.txt' -print0 | 
xargs -0 grep -l 'iso-8859-1' | 
while read -r file; do 
    iconv -f ISO-8859-1 -t UTF-8 "$file" > "$file".converted 
done 

, 파이프 라인에 cut 명령이 필요하지 않습니다.

0

당신은 거의 다 있습니다

find . -name '*.txt' | xargs grep -i iso-8859-1 | cut -f1 -d: | \ 
xargs -I% echo iconv -f l1 -t utf8 % \> %.utf | bash 
+0

당신의 솔루션은 파일'내 동생의 12 '레코드를 어떻게 처리 할 것인가 : Listed a-> z.txt '? –

0

xargs가 쉘에 파이프되어있는 문자열에 xargs가 작동하도록하려는 명령을 echo하면 대체 문제를 해결할 수 있습니다.

find . -name '*.txt' | xargs grep 'iso-8859-1' | cut -d ':' -f1 | 
xargs echo "iconv -f ISO-8859-1 -t UTF-8 {} > {}.converted" | bash