2013-08-16 57 views
14

Tôi có một kịch bản trình bao mà tôi cần phải thực hiện một lệnh nếu một tệp được nén (kết thúc bằng .gz) và một tệp khác nếu tệp đó không có. Tôi không thực sự chắc chắn làm thế nào để tiếp cận này, đây là một phác thảo của những gì tôi đang tìm kiếm:Cách dễ nhất để kiểm tra phần mở rộng tệp trong bash?

file=/path/name* 

if [ CHECK FOR .gz ] 
then echo "this file is zipped" 
else echo "this file is not zipped" 
fi 
+1

'zip! = gzip', phải là" this fi le is (not) gzipped " – jlliagre

+1

Cách * thích hợp * sẽ sử dụng tệp. – devnull

Trả lời

32

Bạn có thể làm điều này với một regex đơn giản, sử dụng toán tử =~ bên trong một thử nghiệm [[...]]:

if [[ $file =~ \.gz$ ]]; 

này sẽ không cung cấp cho bạn câu trả lời đúng nếu phần mở rộng là .tgz, nếu bạn quan tâm đến thứ tại. Nhưng thật dễ dàng để sửa lỗi:

if [[ $file =~ \.t?gz$ ]]; 

Việc thiếu dấu ngoặc kép xung quanh regex là cần thiết và quan trọng. Bạn có thể báo giá $file nhưng không có điểm.

Nó có lẽ sẽ là tốt hơn để sử dụng file tiện ích:

$ file --mime-type something.gz 
something.gz: application/x-gzip 

Cái gì như:

if file --mime-type "$file" | grep -q gzip$; then 
    echo "$file is gzipped" 
else 
    echo "$file is not gzipped" 
fi 
+4

Trong 'bash', bạn cũng có thể sử dụng' if [[$ file = * .gz]] 'thay cho đối sánh cụm từ thông dụng. – chepner

+0

@chepner, đủ chính xác nhưng tôi muốn cung cấp mẫu phù hợp với '.gz' hoặc' .tgz'. Phải thừa nhận rằng, của bạn ngắn hơn một chút. Tuy nhiên, tôi nghĩ giải pháp 'file' là sự lựa chọn tốt hơn. – rici

9

Bạn có thể thử một cái gì đó như thế này: -

if [[ ${file: -3} == ".gz" ]] 
+0

Bạn nên sử dụng '[[' hoặc trích dẫn '$ {tệp: -3}'; nếu không nó sẽ phá vỡ nếu '$ tập tin' có một không gian như là ký tự cuối cùng thứ hai, hoặc (có thể) chứa một siêu ký tự glob trong ba ký tự cuối cùng. – rici

+0

@rici: -Thanx cho đề xuất. Cập nhật câu trả lời của tôi là tốt !! :) –

+3

Bạn cũng có thể sử dụng '$ {file ## *.} = Gz', nó sẽ hoạt động trong bất kỳ shell tuân thủ POSIX nào. – chepner

23

Thực sự, cách rõ ràng và thường dễ nhất để phù hợp với mô hình như thế này trong một kịch bản shell là với case

case "$f" in 
*.gz | *.tgz) 
     # it's gzipped 
     ;; 
*) 
     # it's not 
     ;; 
esac 
+0

Có bạn đã đúng. Đây là IMHO sạch nhất. – Nishant