2012-01-17 42 views
15

Tôi cần đổi tên 45 tệp và tôi không muốn làm từng tệp một. Đây là các tên tệp:Đổi tên tệp bội số bằng vòng lặp bash

chr10.fasta   chr13_random.fasta chr17.fasta   chr1.fasta   chr22_random.fasta chr4_random.fasta chr7_random.fasta chrX.fasta 
chr10_random.fasta chr14.fasta   chr17_random.fasta chr1_random.fasta chr2.fasta   chr5.fasta   chr8.fasta   chrX_random.fasta 
chr11.fasta   chr15.fasta   chr18.fasta   chr20.fasta   chr2_random.fasta chr5_random.fasta chr8_random.fasta chrY.fasta 
chr11_random.fasta chr15_random.fasta chr18_random.fasta chr21.fasta   chr3.fasta   chr6.fasta   chr9.fasta   
chr12.fasta   chr16.fasta   chr19.fasta   chr21_random.fasta chr3_random.fasta chr6_random.fasta chr9_random.fasta 
chr13.fasta   chr16_random.fasta chr19_random.fasta chr22.fasta   chr4.fasta   chr7.fasta   chrM.fasta 

Tôi cần thay đổi phần mở rộng ".fasta" thành ".fa". Tôi đang cố gắng viết một tập lệnh bash để làm điều đó:

for i in $(ls chr*) 

do 

NEWNAME = `echo $i | sed 's/sta//g'` 

mv $i $NEWNAME 

done 

Nhưng nó không hoạt động. Bạn có thể cho tôi biết lý do, hoặc đưa ra một giải pháp nhanh khác?

Cảm ơn!

Trả lời

20

Một số sai lầm ở đây:

  • NEWNAME = nên không có không gian. Ở đây bash đang tìm kiếm một lệnh có tên là NEWNAME và thất bại.
  • bạn phân tích đầu ra của ls. điều này là xấu nếu bạn có các tệp có dấu cách. Bash có thể tự xây dựng danh sách các tệp với toán tử glob *.
  • Bạn không thoát "$i""$NEWNAME". Nếu bất kỳ trong số chúng chứa một khoảng trống, nó sẽ tạo ra hai đối số cho mv.
  • Nếu tên tệp bắt đầu bằng dấu gạch ngang mv sẽ tin rằng đó là một nút chuyển. Sử dụng -- để ngừng xử lý đối số.

Hãy thử:.

for i in chr* 
do 
    mv -- "$i" "${i/%.fasta/.fa}" 
done 

hoặc

for i in chr* 
do 
    NEWNAME="${i/%.fasta/.fa}" 
    mv -- "$i" "$NEWNAME" 
done 

Các "%{var/%pat/replacement} "trông cho patchỉ vào cuối của biến và thay thế nó bằng replacement

+0

tôi không nên đã gỡ bỏ nhận xét của tôi, nhưng tôi thấy bạn đã trả lời ở trên. Cảm ơn. – nickd

+0

đẹp, sử dụng '/%' và '--' cho' mv'. Tôi có lẽ sẽ bao gồm phần mở rộng trong vòng lặp 'for',' cho tôi trong chr * .fasta' – c00kiemon5ter

+0

Cảm ơn câu trả lời hoàn chỉnh của bạn! – Geparada

7
for f in chr*.fasta; do mv "$f" "${f/%.fasta/.fa}"; done 
+0

sẽ không hoạt động nếu các tệp có dấu cách trong tên của chúng. – Benoit

+0

+1, nhiều sự lựa chọn – bobah

+0

mặc dù điều này sẽ làm việc với dữ liệu đã cho, khoảng trống trong tệp hoặc tệp chứa '.fasta' trong tên tệp của chúng và không chỉ là phần mở rộng của chúng? nhiều thứ có thể sai ở đây – c00kiemon5ter

6

Nếu bạn có lệnh rename, bạn có thể làm:

rename .fasta .fa chr*.fasta 
+0

Tôi sẽ sử dụng lệnh này cho lần sau, cảm ơn! – Geparada

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