Xóa các ký tự nhất định khỏi nhiều tệp bằng whitepsaces


8

Tôi đang cố đổi tên một loạt các bản nhạc trong một thư mục, nhưng tôi đã gặp lỗi này:

Khi di chuyển nhiều tệp, đối số cuối cùng phải là một thư mục

Đây là kịch bản:

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

Điều này hoạt động cho một tập tin không có khoảng trắng, tôi sẽ sửa đổi tập lệnh này như thế nào?

Câu trả lời:


14

Sử dụng dấu ngoặc kép:

mv -- "$file" "$(echo "$file" | sed ...)"

Khác mvnhìn thấy nhiều đối số. Một tên tệp được gọi file name with spacessẽ là 4 đối số cho mv. Do đó, lỗi : when moving multiple files, last argument must be a directory. Khi mvcó nhiều hơn 2 đối số, giả sử bạn muốn di chuyển nhiều tệp vào một thư mục (lúc đó sẽ là đối số cuối cùng).


Tuy nhiên, có vẻ như bạn muốn xóa 5 ký tự đầu tiên khỏi tên tệp. Điều đó có thể được thực hiện đơn giản hơn với bash:

mv -- "$file" "${file:5}"

Chỉnh sửa : Tôi đã thêm --cờ, nhờ nhận xét của @ pabouk . Bây giờ tập tin bắt đầu với dấu gạch ngang -cũng được xử lý chính xác.


2
Điều đó có thể không hoạt động với tên tập tin bắt đầu bằng -. Thay vì echo "$file"sử dụng printf '%s\n' "$file".
pabouk

Tôi quên mất mv. :) Bạn đã xử lý trường hợp đó :) --- Ý tôi là vấn đề với echochính nó. Ví dụ GNU echo (cả độc lập và bash built-in) sẽ không in những chuỗi: -n, -e-E. Ngay cả theo định nghĩa POSIX, không thể sử dụng echomột cách đáng tin cậy vì các tình huống nhất định không được xác định. Tuân thủ XSI echosẽ giải thích các chuỗi thoát dấu gạch chéo ngược. --- printf '%s\n'không có tác dụng phụ thuộc không mong muốn và thực hiện như vậy.
pabouk

3

Bạn có thể sử dụng tên, thường được phân phối cùng với Perl. (Ví dụ: trong Debian, / usr / bin / prename được cài đặt bởi perlgói.) Nếu không được đóng gói bởi bản phân phối của bạn (hãy tìm prenamerenametrong các vị trí nhị phân thông thường), nó có sẵn để tải xuống từ một số nơi, chẳng hạn như ví dụ ở đây , ở đây hoặc ở đây .

Tập lệnh này lấy một biểu thức chính quy để áp dụng cho từng tên tệp và một tập hợp các tên tệp và sửa đổi tên của các tệp đó theo biểu thức chính quy đó.

Ví dụ, bạn có thể làm

prename -v -n 's/^.{5}//' *

để hiển thị những gì sẽ xảy ra nếu bạn loại bỏ năm ký tự đầu tiên trong tên tệp. Để thực sự đổi tên, bạn chỉ cần xóa -n.

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.