2010-02-19 26 views
63

Kịch bản:Tập lệnh Linux Shell cho mỗi tệp trong thư mục Lấy tên tệp và thực thi chương trình

Thư mục trong hệ thống Linux. Tôi muốn lặp qua mọi tệp .xls trong một thư mục.

Thư mục này thường bao gồm các thư mục khác nhau, các loại tệp khác nhau (.sh, .pl, .csv, ...).

Tất cả những gì tôi muốn làm là lặp qua tất cả các tệp trong thư mục gốc và chỉ thực hiện chương trình trên các tệp .xls.

Edit:

Vấn đề là chương trình tôi phải thực hiện là 'xls2csv' để chuyển đổi từ .xls để .csv định dạng. Vì vậy, đối với mỗi tệp .xls tôi phải lấy tên tệp và thêm nó vào .csv.

Ví dụ, tôi có một file test.xls và các đối số fro xls2csv là: xls2csv test.xls test.csv

Did I có ý nghĩa?

Trả lời

156

bash:

for f in *.xls ; do xls2csv "$f" "${f%.xls}.csv" ; done 
+5

+1 cho sự đơn giản – Tom

+0

Thật tuyệt vời! Hoạt động hoàn hảo! Cảm ơn bạn rất nhiều! – ThinkCode

+5

Đây chính là điều tôi đang tìm kiếm vì một lý do hoàn toàn khác. Một chút chỉnh sửa và nó hoàn hảo cho nhu cầu cụ thể của tôi. Cảm ơn = D Và đối với bất kỳ ai không rõ ràng về điều này: $ {f% .ext} thay thế tên tệp mà không có phần mở rộng, vì vậy trong ví dụ này, nó sẽ hiển thị thành "filename.csv" thay vì " filename.xls.csv ". – Frungi

9

Nhìn vào lệnh find.

gì bạn đang tìm kiếm là một cái gì đó giống như

find . -name "*.xls" -type f -exec program 

bài viết chỉnh sửa

find . -name "*.xls" -type f -exec xls2csv '{}' '{}'.csv; 

sẽ thực hiện xls2csv file.xls file.xls.csv

Closer to những gì bạn muốn.

+0

'tìm -maxdepth 1' để loại trừ các thư mục con. Điều này cũng chuyển 'test.xls' thành' test.xls.csv' thay vì 'test.csv'. Vì vậy, không * khá * những gì OP yêu cầu, nhưng khá gần. – ephemient

+0

Sử dụng '{}' làm chuỗi con của đối số thay vì toàn bộ đối số là phần mở rộng của GNU, không được đảm bảo bởi thông số POSIX cho 'tìm'. Như vậy, câu trả lời này không nhất thiết phải di động đối với các nền tảng không phải GNU. –

2
find . -type f -name "*.xls" -printf "xls2csv %p %p.csv\n" | bash 

bash 4 (recursive)

shopt -s globstar 
for xls in /path/**/*.xls 
do 
    xls2csv "$xls" "${xls%.xls}.csv" 
done 
+0

Giải pháp tuyệt vời. Tôi đã sử dụng điều này để cho phép tôi viết haml/scss và xây dựng thành html/css tại thời điểm thiết kế cho một dự án node.js. –

+1

Điều này hoàn toàn nguy hiểm nếu bạn không tin tưởng tên tệp của bạn không chứa những thứ như '$ (rm -rf /)' ... hoặc chỉ khoảng trắng. –

9
for i in *.xls ; do 
    [[ -f "$i" ]] || continue 
    xls2csv "$i" "${i%.xls}.csv" 
done 

Dòng đầu tiên trong do kiểm tra nếu "phù hợp với" tập tin thực sự tồn tại, bởi vì trong trường hợp không có gì phù hợp trong số for của bạn, do sẽ được thực hiện với "* .xls" dưới dạng $i. Điều này có thể là khủng khiếp đối với xls2csv của bạn.

Các vấn đề liên quan