lệnh bash cho mỗi tệp trong một thư mục


31

Tôi có một tập hợp các tệp mà tôi muốn áp dụng cùng một lệnh và đầu ra phải chứa cùng tên với tệp được xử lý nhưng với một phần mở rộng khác.

Hiện tại tôi đang thực hiện đổi tên /my/data/Andrew.doc thành /my/data/Andrew.txt Tôi muốn làm điều này cho tất cả các tệp .doc từ thư mục / my / data / và để giữ tên.

Tôi đã thử một vài phiên bản nhưng tôi đoán rằng tôi có lỗi trong cú pháp khi tôi mới sử dụng linux.


→ ví dụ đầy đủ và thực tế hơn một chút: stackoverflow.com/a/43474757/444255
Frank Nocke

Câu trả lời:


76

Có ít nhất một trăm ngàn triệu cách khác nhau để tiếp cận điều này nhưng đây là những ứng cử viên hàng đầu:

Vòng lặp Bash cho

for f in ./*.doc; do
    # do some stuff here with "$f"
    # remember to quote it or spaces may misbehave
done

Sử dụng find

Các findlệnh có một chút đáng yêu execlệnh đó là tuyệt vời để chạy điều (với một số báo trước). Tìm kiếm tốt hơn toàn cầu cơ bản vì bạn thực sự có thể lọc các tệp bạn đang chọn. Hãy cẩn thận với cú pháp lẻ.

find . -iname '*.doc' -exec echo "File is {}" \;

Lưu ý rằng đó findlà đệ quy vì vậy bạn có thể muốn sử dụng -maxdepth 1để giữ findtrong thư mục làm việc hiện tại. -type fcó thể được sử dụng để lọc ra các tập tin thông thường.

Nếu chúng ta chỉ đổi tên doc thành txt ...

Các renamelệnh được sed giống như trong việc tìm kiếm. Rõ ràng điều này sẽ không làm bất cứ điều gì để chuyển đổi định dạng.

rename 's/doc$/txt/' *.doc

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.