Làm thế nào để tôi đệ quy đi qua các thư mục và đặt tên một tệp sau thư mục?


0

Những gì tôi đang cố gắng làm là kết hợp tất cả các tệp trong thư mục con vào một tệp mới và đặt tệp kết hợp mới có cùng tên với thư mục con và tôi không biết làm thế nào để làm điều này trong Bash. Đây là cách tôi tiếp cận nó: Tôi có một số thư mục, mỗi thư mục có một tên tệp duy nhất (có dấu cách!). Trong mỗi thư mục này, có một số tệp được đặt tên bằng số, như vậy:

Home/Unique name/1.pdf  
Home/Unique name/2.pdf  
Home/Unique name/3.pdf  
Home/Unique name/4.pdf  
....  
Home/Other Unique name/1.pdf  
Home/Other Unique name/2.pdf  
Home/Other Unique name/3.pdf  
Home/Other Unique name/4.pdf

Những gì tôi muốn làm là viết một tập lệnh bash (từ Homethư mục) đến:

  1. Đi vào từng thư mục duy nhất và thực hiện một lệnh trên mỗi tệp trong thư mục đó (trong trường hợp của tôi, sao chép tất cả chúng vào một thư mục khác).
  2. Sau đó tôi đã viết một tập lệnh khác script.shsẽ thực hiện một lệnh khác (trong trường hợp này, kết hợp tất cả các tệp PDF thành một tệp duy nhất temp.pdf). Sau đó tôi muốn đổi tên temp.pdftập tin đó sau thư mục Unique name.pdf(có dấu cách).
  3. Tôi sẽ phải tuân theo quy trình này cho một số thư mục con.

Tôi đã thử một giải pháp với một số vòng lặp, trong khi các vòng lặp và sử dụng lệnh find, nhưng tôi không đủ thoải mái với bash để gỡ lỗi thoải mái hoặc sử dụng các biến này với bất kỳ mức độ tin cậy nào. Tôi cũng chắc chắn rằng có một cách hiệu quả hơn để làm những gì tôi đang làm, nhưng tôi đã khởi động lại tập lệnh cùng nhau trong một khoảng thời gian.


Nên là một chương trình C hoặc Java tương đối đơn giản.
Daniel R Hicks

Trừ khi bạn làm điều này cho các tệp được mã hóa bằng văn bản thuần túy, các tệp kết quả sẽ không được coi là hợp lệ. Ví dụ: nếu bạn chỉ ghép dữ liệu nhị phân trong một vài tệp PDF, tệp kết quả không phải là tệp tuân thủ PDF (nếu bạn may mắn, nó có thể chỉ hiển thị cho bạn tệp PDF đầu tiên). Bạn cần một công cụ cụ thể cho định dạng của tệp bạn muốn tham gia. Tuy nhiên, để tham gia một số tệp, bạn chỉ cần sử dụng catđể hiển thị tất cả chúng theo đúng thứ tự và chuyển kết quả catvào một tệp mới.
Đột phá

@DanielRHicks sử dụng C cho một cái gì đó đơn giản này sẽ vui nhộn quá mức cần thiết
evilsoup

Câu trả lời:


1

Cách POSIX là sử dụng print . -type d ... | while read f; do, nhưng trừ khi bạn bị ám ảnh bởi tính di động 100%, tôi sẽ không bận tâm đến điều đó. Nếu bạn có bash 4+ và pdfunite(được cài đặt theo mặc định trên Ubuntu 13.04 của tôi), bạn có thể thực hiện việc này trong hai dòng:

shopt -s globstar
for f in ./**/; do pdfunite "$f"/*.pdf "$f"/"$(basename "$f").pdf"; done

Lưu ý rằng shopt -s globstarcần phải nằm trên một dòng riêng biệt với phần còn lại của nó. Khi bật sao, **mở rộng tới tất cả các tệp và thư mục trong thư mục hiện tại, theo cách đệ quy. Vì các tệp không thể chứa /trong tên của chúng, **/sẽ chỉ mở rộng sang các thư mục. Tôi sử dụng ./**/trong trường hợp không chắc là thư mục của bạn bắt đầu bằng dấu gạch nối ( -) vì điều này có thể gây ra sự cố, vì nhiều chương trình coi bất cứ điều gì bắt đầu bằng một -tùy chọn.

Như đã viết, điều này sẽ không sao chép các tệp PDF sang một thư mục khác, nhưng điều đó khá tầm thường để thêm vào:

for f in ./**/; do cp "$f"/*.pdf /target/dir/; pdfunite "$f"/*.pdf "$f"/"$(basename "$f").pdf"; done

Nếu bạn muốn sử dụng tập lệnh kết hợp pdf tùy chỉnh của riêng mình, thì chỉ cần thay đổi dòng cho phù hợp - nhưng hãy nhớ rằng bản chất của tập lệnh shell là kết hợp các lệnh có sẵn.

Đây là một phiên bản di động hơn một chút:

print . -type d -print0 | while read -d $'\0' f; do
  pdfunite "$f"/*.pdf "$f"/"$(basename "$f").pdf"
done

0
  1. Tạo forvòng lặp với find /home/ -type f -name "*.pdf"tư cách là một biến
  2. Sao chép các tệp vào nơi bạn cần đến, lấy $ VARIABLE và xử lý nó thông qua sed / awk để xóa "/".

Đăng kịch bản của bạn và chúng tôi có thể giúp bạn cải thiện nó.

Bạn luôn có thể chạy các tập lệnh bash -xđể gỡ lỗi chúng hoặc bạn có thể đặt !#/bin/bash -xđể luôn thực thi trong chế độ gỡ lỗi (dài dòng).

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.