2012-01-24 29 views
5

Tôi đang cố gắng tìm tất cả các tệp văn bản có mã hóa iso-8859-1 và chuyển đổi chúng thành UTF-8. nỗ lực của tôi cho đến nay là:xargs: thay thế biến sau khi chuyển hướng

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

The (rõ ràng) vấn đề là các biến thay thế cuối cùng sẽ không làm việc, kể từ {} xảy ra sau khi chuyển hướng, và không thuộc về xargs. Vì tôi chỉ nhận được một tệp có tên là {}.converted, không phải a.txt.converted, b.txt.converted v.v ... Làm cách nào để tôi có thể thực hiện công việc này?

Lưu ý: Tôi đang thực hiện việc này trên Cygwin, nơi biểu tượngv dường như không hỗ trợ -o.

+0

Vui lòng xem [câu hỏi liên quan] này (http://stackoverflow.com/q/845863/183066). – jcollado

+0

Tôi không biết câu trả lời nào để chấp nhận. Các câu trả lời của e.dan và glenn là thực dụng nhất, nhưng Ole Tanges là sự hài lòng nhất về mặt thẩm mỹ. chorobas cũng khá là đẹp. Phải suy nghĩ về nó. –

Trả lời

3

Nếu bạn có GNU Parallel http://www.gnu.org/software/parallel/ cài đặt bạn có thể làm điều này:

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

Bạn có thể cài đặt GNU Parallel đơn giản bằng cách:

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

Xem video giới thiệu cho GNU Parallel để tìm hiểu thêm: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

1

Làm thế nào về một for vòng lặp như:

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

Giải pháp của bạn sẽ xử lý như thế nào đối với tập tin: 'Hồ sơ của tôi 12' của tôi: Liệt kê a-> z.txt'? –

1

Giả sử không ai trong số các tập tin của bạn có ký tự xuống dòng trong tên, và giả sử bạn có GNU tìm và xargs ::

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 

Với grep -l, bạn không cần lệnh cut trong đường dẫn.

0

Bạn đang ở gần đó:

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

Giải pháp của bạn sẽ xử lý như thế nào với tập tin: 'My brother's 12": Liệt kê a-> z.txt '? –

0

lặp lại lệnh bạn muốn xargs hoạt động trên một chuỗi được đưa vào vỏ và điều đó sẽ khắc phục được sự cố thay thế.

find . -name '*.txt' | xargs grep 'iso-8859-1' | cut -d ':' -f1 | 
xargs echo "iconv -f ISO-8859-1 -t UTF-8 {} > {}.converted" | bash 
Các vấn đề liên quan