thêm văn bản vào tên tệp trước khi mở rộng


25

Tôi muốn thêm văn bản vào cuối tên tệp nhưng trước phần mở rộng. Ngay bây giờ tôi đang cố gắng,

for f in *.shp; do echo $f_poly; done

đầu ra là,

Quercus_acutifolia.shp_poly
Quercus_agrifolia.shp_poly
Quercus_corrugata.shp_poly
Quercus_cortesii.shp_poly
Quercus_costaricensis.shp_poly
Quercus_havardii.shp_poly
Quercus_hemisphaerica.shp_poly
Quercus_kelloggii.shp_poly
Quercus_knoblochii.shp_poly
Quercus_laceyi.shp_poly

Tôi muốn trở thành,

Quercus_acutifolia_poly.shp
Quercus_agrifolia_poly.shp
Quercus_corrugata_poly.shp
Quercus_cortesii_poly.shp
Quercus_costaricensis_poly.shp
Quercus_havardii_poly.shp
Quercus_hemisphaerica_poly.shp
Quercus_kelloggii_poly.shp
Quercus_knoblochii_poly.shp
Quercus_laceyi_poly.shp

Câu trả lời:


27

Sử dụng mở rộng tham số POSIX tiêu chuẩn :

for f in *.shp; do printf '%s\n' "${f%.shp}_poly.shp"; done

Tuyệt vời đó chính xác là những gì tôi cần.
Sam007

1
Có thể tốt hơn với một lời giải thích làm thế nào nó hoạt động. Câu trả lời Doug là khá dễ dàng, mặt khác.
Sange Borsch

@SargeBorsch Bạn cần giải thích gì? Câu trả lời của tôi, đoạn trích trong câu hỏi và câu trả lời của Doug chỉ khác nhau bởi một vài ký tự và câu trả lời của Doug thậm chí còn ít hơn tôi nên tôi không biết bạn muốn gì. Nếu bạn chỉ so sánh sự khác biệt trong hai kết quả đầu ra trong câu hỏi thì thật dễ dàng để tìm ra những gì họ làm. Tôi có thể giải thích tại sao câu trả lời của tôi thích hơn Doug. 1. Tôi sử dụng printfvới một chuỗi định dạng thay vì ít di động echo. 2. Tôi sử dụng mở rộng tham số hiệu quả hơn so với gọi nhị phân ngoài ( basename) cho một tác vụ đơn giản như vậy.
jw013

Sau đó, lệnh đổi tên các tệp sẽ là:for f in *.shp; do mv $f ${f%.shp}_poly.shp; done
Patch92

6

Đôi khi có một công cụ gọi là "đổi tên" được cài đặt.

rename 's/\.shp$/_poly.shp/' *shp

Nó có thể không di động nhưng nó rất dễ sử dụng.


1
Đây là người duy nhất làm việc cho tôi, câu trả lời tuyệt vời!
giang hồ0810

4

Dùng cái này:

for file in *.shp; do echo $(basename $file .shp)_poly.shp; done

3
Sử dụng basenamechậm hơn và kém hiệu quả hơn so với việc để vỏ tự thực hiện công việc. Điều này có thể đáng chú ý đối với số lượng rất lớn các tập tin.
jw013

Ngoài ra, còn thiếu dấu ngoặc kép và --s không thành công đối với tên tệp có ký tự dòng mới trước .shp.
Stéphane Chazelas

Cảm ơn đã đưa ra một câu trả lời tôi thực sự có thể làm việc với mục đích của tôi. Đây là bash giúp đỡ, không phải mã golf. (đọc trên này .. Tôi nhận ra nó có thể có vẻ như tôi đã được châm biếm More nắm về câu trả lời khác về đây hơn của bạn Cảm ơn một lần nữa..)
Tim

3

Điều này làm việc tốt hơn cho tôi:

for f in *; do NEW=${f%.webm}_2016.webm; mv ${f} "${NEW}"; done


Chà, điều này trông rất giống câu trả lời được chấp nhận ngoại trừ bạn có thể muốn for f in *.webm, bạn đã quên trích dẫn ${f}và bạn đang thiếu a --.
Stéphane Chazelas

1
Câu trả lời được chấp nhận không hoạt động trên OSX, nó chỉ in ra tên tệp mới, nó không thực sự đổi tên các tệp
Vinnie James

1
Tất nhiên, nó chỉ cho bạn cách sử dụng các bản mở rộng shell để lấy tên tệp mới, để trả lời cho câu hỏi cũng xuất ra một tên tệp (với echo), nhưng không phải là tên bắt buộc.
Stéphane Chazelas

1

Nếu họ ở các địa điểm khác nhau thì hãy chạy: -

for i in ` find /root/test/ -name "*.shp" ` ;
do
  mv $i ` echo $i | sed 's/.shp$/_poly.shp/g' ` ;
done

1

Vì câu hỏi là bashkhông cần các tiện ích bên ngoài, vì bạn có thể sử dụng biểu thức bash regexps :

for i in *.shp
do
    mv -v "${i}" "${i%.*}_MYSUFFIX.${i##*.}"
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.