Làm cách nào để đổi tên nhiều tệp bằng cách xóa các ký tự trong bash?


10

Tôi phải đổi tên nhiều tệp trong thư mục bằng cách xóa 5 ký tự đầu tiên cho mỗi tên tệp.
Làm thế nào tôi có thể làm điều này tôi bash / shell? Tôi đang sử dụng Ubuntu 11.10. Cảm ơn.

Câu trả lời:


11

Một vòng lặp đơn giản với một chút sedý chí sẽ thực hiện thủ thuật:

% touch xxxxx{foo,bar,baz}
% ls -l xxxxx{foo,bar,baz}
-rw-r--r--  1 jamesog  wheel  0 29 Dec 18:07 xxxxxbar
-rw-r--r--  1 jamesog  wheel  0 29 Dec 18:07 xxxxxbaz
-rw-r--r--  1 jamesog  wheel  0 29 Dec 18:07 xxxxxfoo  
% for file in xxxxx*; do mv $file $(echo $file | sed -e 's/^.....//'); done
% ls -l foo bar baz
-rw-r--r--  1 jamesog  wheel  0 29 Dec 18:07 bar
-rw-r--r--  1 jamesog  wheel  0 29 Dec 18:07 baz
-rw-r--r--  1 jamesog  wheel  0 29 Dec 18:07 foo

Regex thay thế trong sednói phù hợp với bất kỳ năm ký tự ( .có nghĩa là bất kỳ ký tự nào) ở đầu chuỗi ( ^) và loại bỏ nó.


9

Bash có một số khả năng kịch bản tuyệt vời. Đây là một cách:

for file in ??????*; do mv $file `echo $file | cut -c6-`; done

Một cách thuận tiện để kiểm tra những gì nó sẽ làm là thêm một tiếng vang trước lệnh:

for file in ??????*; do echo mv $file `echo $file | cut -c6-`; done

Sáu dấu hỏi đảm bảo rằng bạn chỉ cố gắng thực hiện điều này với tên tệp dài hơn 5 ký tự.


5

Bạn có thể sử dụng sed để làm điều này

for file in * ; do mv $file  $(echo $file |sed 's/^.\{5\}//g'); done

5

Tất cả các câu trả lời tuyệt vời, cảm ơn. Đây là những gì đã làm việc trong trường hợp của tôi:

rename 's/^.......//g' *

0

Theo quan điểm của tôi':

for file in *; do mv $file ${file:5}; done

${file:n}loại bỏ các nký tự đầu tiên trong chuỗi file.

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.