2009-09-08 35 views
61

xin lỗi vì câu hỏi ngu ngốc đúng, nhưng tôi khá là một người mới. Tôi có tải các tập tin mà trông như thế này:đổi tên một phần tên tập tin

DET01-ABC-5_50-001.dat 
... 
DET01-ABC-5_50-0025.dat 

và tôi muốn họ nhìn như thế này:

DET01-XYZ-5_50-001.dat 
... 
DET01-XYZ-5_50-0025.dat 

làm thế nào tôi có thể làm điều này? Tôi đã thử một số điều từ diễn đàn này nhưng tôi dường như làm cho một sai lầm. Cảm ơn sự giúp đỡ của bạn!

Trả lời

123

Có một vài biến thể của một lệnh đổi tên, trong trường hợp của bạn, nó có thể đơn giản như

rename ABC XYZ *.dat 

Bạn có thể có một phiên bản mà phải mất một regex Perl;

rename 's/ABC/XYZ/' *.dat 
+0

+1 cách đơn giản nhất – rangalo

+0

cảm ơn một triệu! Điều đó thật dễ dàng (nếu bạn biết cách ;-)) –

+2

Chào mừng bạn đến với stackoverflow! –

3

Bạn sẽ cần phải học cách sử dụng sed http://unixhelp.ed.ac.uk/CGI/man-cgi?sed

Và cũng để sử dụng cho nên bạn có thể lặp qua mục tập tin của bạn http://www.cyberciti.biz/faq/bash-for-loop/

lệnh của bạn sẽ trông giống như thế này, tôi không có một thuật ngữ bên cạnh tôi vì vậy tôi không thể kiểm tra

for i in `dir` do mv $i `echo $i | sed '/orig/new/g'` 
1

Tôi thích làm điều này với sed. Trong trường hợp của bạn:

for x in DET01-*.dat; do 
    echo $x | sed -r 's/DET01-ABC-(.+)\.dat/mv -v "\0" "DET01-XYZ-\1.dat"/' 
done | sh -e 

Tốt nhất nên bỏ qua phần "shee" trước để xem điều gì sẽ được thực hiện.

+0

có thể tôi đang làm điều gì đó sai, nhưng điều này không làm gì với tệp của tôi? –

+0

Bạn đang thử có hoặc không có "sh -e"? Nếu bạn đang cố gắng mà không có nó không phải là nghĩa vụ phải. Nó chỉ in những gì sẽ được thực hiện ("mv -v ... ..." dòng) như một cơ hội để kiểm tra xem mọi thứ có ổn không. Nếu bạn thích những gì bạn thấy thêm "sh -e". – stribika

6

Một cái gì đó như thế này sẽ làm điều đó. Bạn có thể cần sửa đổi vòng lặp for tùy thuộc vào tên tệp bạn muốn chụp.

for fspec1 in DET01-ABC-5_50-*.dat ; do 
    fspec2=$(echo ${fspec1} | sed 's/-ABC-/-XYZ-/') 
    mv ${fspec1} ${fspec2} 
done 

Bạn nên thường xuyên kiểm tra các kịch bản trên bản dữ liệu của bạn, bằng cách này, và trong thư mục hoàn toàn khác nhau.

+0

đối với osx. đổi tên trông mát mẻ, nhưng một cài đặt brew đổi tên có vẻ như để cài đặt một kịch bản perl mà không làm việc cho mỗi ví dụ trên. Một số googling chỉ ra rằng đổi tên không có sẵn trên tất cả các vars linux và rằng có infact một phiên bản perl nổi về. Tôi có khoảng 10 phút để cố gắng phân loại những khác biệt và quyết định - bạn biết câu trả lời này chỉ đơn giản là đủ :). – j03m

1

Tất cả các câu trả lời đều đơn giản và tốt. Tuy nhiên, tôi luôn muốn thêm một chế độ tương tác vào các tập lệnh này để tôi có thể tìm thấy các mặt tích cực sai.

nếu [[-n $ inInteractiveMode]]
sau đó
    vang -e -n "$ oldFileName => $ newfilename \ nBạn có muốn làm thay đổi này [Y/n]:?"
    đọc chạy

    [[-z $ chạy || "$ run" == "y" || "$ Chạy" == "Y"]] & & mv "$ oldFileName" "$ newfilename"
fi

Hoặc thực hiện chế độ tương tác mặc định và thêm một lá cờ lực (-f | --force) cho các tập lệnh tự động hoặc nếu bạn cảm thấy táo bạo. Và điều này không làm chậm bạn quá nhiều: câu trả lời mặc định là "có, tôi muốn đổi tên" để bạn chỉ cần nhấn phím enter tại mỗi lời nhắc (vì thử nghiệm `` -z $ chạy \.

77
for file in *.dat ; do mv $file ${file//ABC/XYZ} ; done 

Không cần rename hoặc sed. Chỉ cần bash parameter expansion.

+5

Nếu tên tệp có dung lượng, bạn nên sử dụng báo giá. Xem đoạn mã bên dưới ... 'cho tệp trong * .dat; làm mv "$ file" "$ {file // ABC/XYZ}"; done' –

+0

Hoạt động tốt trên OSX –

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