Làm cách nào để chuyển đổi tất cả các tệp pdf thành văn bản (trong một thư mục) bằng một lệnh?


18

Tôi biết rằng tôi có thể chuyển đổi các tệp pdf thành các tệp văn bản từng cái một như thế này:

$ pdftotext filename.pdf

Nhưng có một lệnh duy nhất thực hiện chuyển đổi đó mà không chỉ định các tên tệp riêng biệt để chuyển đổi tất cả chúng không?

Tôi thấy ở đây, trên Wikipedia , rằng "Ký tự đại diện (*), ví dụ $ pdftotext * pdf, để chuyển đổi nhiều tệp, không thể được sử dụng vì pdftotext chỉ mong đợi một tên tệp."

pdf  text  convert  batch 

Câu trả lời:


23

Sau đây sẽ chuyển đổi tất cả các tập tin trong thư mục hiện tại:

for file in *.pdf; do pdftotext "$file" "$file.txt"; done

Một lệnh duy nhất của nó, nó có thể được gõ vào một dòng trong thiết bị đầu cuối (pdftotext bên trong một vòng lặp for trong một cú pháp một dòng, đó là những gì op yêu cầu)
Sam

kiểm tra những liên kết này để biết thêm về cách thức cho vòng lặp hoạt động: cyberciti.biz/faq/bash-for-loop thegeekstuff.com/2011/07/bash-for-loop-examples
Sam

điều này sẽ không gây ra vấn đề với các tập tin không phải pdf?
cprofitt

Điều này sẽ không tạo ra các tệp như "filename.pdf.txt"?
Ryan C. Thompson

vâng, nếu đó là một vấn đề, chúng tôi có thể xóa phần mở rộng .pdf bằng cách sử dụng 'sed' hoặc 'awk' nhưng nó sẽ tăng thêm độ phức tạp cho lệnh
Sam

8
ls *.pdf | xargs -n1 pdftotext

xargsthường là một giải pháp nhanh chóng để chạy cùng một lệnh nhiều lần chỉ với một thay đổi nhỏ mỗi lần. Các -n1tùy chọn đảm bảo rằng chỉ có một file pdf được chuyển cho pdftotext tại một thời điểm.

Chỉnh sửa: Nếu bạn lo lắng về khoảng trắng trong tên tệp và như vậy, bạn có thể sử dụng thay thế này:

find . -name '*.pdf' -print0 | xargs -0 -n1 pdftotext

xin vui lòng xem câu trả lời của tôi: lệnh đó có thể được điều chỉnh để tránh vấn đề được đề cập ở đó không? điều này không có nghĩa là giải pháp của bạn không tốt, ngược lại, nó làm một cái gì đó rất cụ thể mà các giải pháp thay thế khác ở đây không làm được. nhưng tôi chỉ tò mò

2
Ngoài ra:ls *.pdf | xargs -L1 -I% pdftotext % %.txt
kenorb

2

viết một kịch bản bash

for f in *.pdf; do
  pdftotext "$f"
done

hoặc nhập nó trong lệnh một dòng như sau:

for f in *.pdf; do pdftotext "$f"; done

Tôi hi vọng cái này giúp được. Tôi không có một nhóm lớn .pdf để kiểm tra điều này, nhưng tôi sử dụng chiến lược này để chuyển đổi các tệp .flac của mình thành các tệp .ogg.


nó có thể được thực hiện bằng cách mở terminal trong thư mục đó và chạy lệnh thay vì chèn đường dẫn thủ công không?

bạn không thể dán nó ở đây như vậy và chèn nó vào câu trả lời của bạn? đó sẽ là một câu trả lời tốt tôi đã không thể đạt được công thức tốt chỉ bằng cách xóa một phần của những gì bạn đã đăng

các tìm kiếm và xargs tôi đề nghị ban đầu không hoạt động khi tôi có cơ hội kiểm tra chúng.
cprofitt

1

Trước tiên tôi phải cảm ơn SamRyan Thompson cho tất cả những người trả lời khác - vì câu trả lời của tôi ở đây không có gì ngoài một biến thể liên quan đến khả năng thêm giải pháp của họ vào hành động tùy chỉnh của Thunar:

vì vậy, như bất kỳ lệnh đầu cuối nào, một lệnh để chuyển đổi thành văn bản tất cả các tệp pdf trong một thư mục có thể được đặt trong danh sách các hành động tùy chỉnh trong trình quản lý tệp Thunar

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

Lệnh có find . -name '*.pdf' -print0 | xargs -0 -n1 pdftotext, (đến từ Ryan Thompson ) đó là lệnh tôi thích sử dụng, nhưng nó có một bước ngoặt khó chịu ... xem bên dưới ...

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

... đó là một lệnh vui nhộn, được sử dụng cẩn thận: nó được thực hiện để chuyển đổi thành văn bản tất cả pdf trong thư mục được kích hoạt, vì vậy, nếu nó bị bắn do nhầm lẫn trong thư mục nhà, nó sẽ có một số điều không mong muốn hiệu ứng: tất cả các pdf của bạn sẽ được chuyển đổi thành văn bản!

(Tôi đã thử nghiệm nó như thế này: tạo một thư mục có tên "test" trên desktop và trong đó một tập tin pdf và một loạt các thư mục bên trong thư mục ( /Desktop/test/a/b/c/e/f/g/h/i) mỗi chứa pdf cùng Chạy lệnh rằng trong. /Desktop/testĐã chuyển đổi tất cả các file PDF xuống ở chỗ thư mục "i".)

(Tôi sẽ hoan nghênh ý kiến ​​về cách điều chỉnh lệnh này để tránh rủi ro đó.)

Thay thế điều đó bằng một ( for file in *.pdf; do pdftotext "$file" "$file.txt"; done) khác đến từ Sam , vấn đề được tránh.

Nhưng trong một số trường hợp nhất định, người ta có thể muốn chính xác giải pháp của Ryan làm gì!


1
Bạn có thể tránh findlệnh tìm kiếm trong thư mục con bằng cách sử dụng -maxdepth 1. Ngoài ra, khi đưa nó vào tính năng hành động tùy chỉnh của Thunar, có lẽ bạn nên thay thế find .bằng find %Fđể cho phép Thunar vượt qua đúng đường dẫn của các thư mục đã chọn.
Ryan C. Thompson

0
for file in *.pdf; do pdftotext "$file" "$file.txt"; done

Cái này xuất ra sample.pdf.txt .

Tôi đã thử sử dụng cái này, như user2357111317 gợi ý và tôi cũng bao gồm -layout để giữ nguyên bố cục của văn bản

for file in *.pdf; do pdftotext -layout "$file"; done
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.