Làm thế nào để loại bỏ các ký tự dấu trong tên tệp trong Bash?


13

Tôi có một loạt các tập tin phương tiện như dưới đây:

tvshow.s01e11]Bloodlines.avi
tvshow.s01e12]suffer.avi
tvshow.s01e13]NotMe.avi

Tôi muốn đổi tên chúng thành

tvshow.s01e11.avi
tvshow.s01e12.avi
tvshow.s01e13.avi

Tôi đã thử sử dụng đổi tên nhưng rõ ràng là tôi không hiểu đúng cú pháp vì nó không thành công.


Nếu bạn muốn làm điều này trong một gui, krenamethật đáng yêu. Nó có tất cả các loại tùy chọn mạnh mẽ và cho bạn thấy những gì nó sẽ làm trước khi nó thực sự làm điều đó. Bạn thậm chí có thể sử dụng nó để kiểm tra các mẫu mà bạn có thể sử dụng trong bash sau này.
Joe

Câu trả lời:



14

Trong shell, người ta có thể làm đơn giản:

for x in *]*.avi ; do 
    mv -i "$x" "${x%]*.avi}.avi"
done

Shell có thể tạo ra một danh sách các tên tệp chỉ bằng một quả cầu thông thường và ${var%pattern}loại bỏ mẫu phù hợp (ngắn nhất) khỏi cuối chuỗi trong biến var. Vì phần mở rộng cuối cùng luôn luôn .avi, tôi chỉ cần loại bỏ nó với mẫu và thêm nó trở lại. Với dấu ngoặc kép, cái này cũng hoạt động với tên tệp chứa khoảng trắng, nhưFancy Name for a Show.s01e01]Asdf.avi


@NoviceC mô hình extglob không phải là một ý tưởng tồi. Trên thực tế, một cái gì đó giống như ${x/]*([^.])}nên làm, nó loại bỏ một dấu ngoặc và bất kỳ số lượng không dấu chấm nào. (mặc dù không thành công nếu có dấu ngoặc hoặc dấu chấm khác, vì nó không bị khóa ở cuối chuỗi)
ilkkachu

Đó là một điểm hay. Nhưng tôi thực sự chỉ giải quyết vấn đề khi tôi nên đi cùng ${x/]*.avi}và chỉ cần thêm một người .avinhư bạn. Nhưng tôi cũng không hài lòng với việc không gian trong tên sẽ bị phá vỡ như thế nào (`find . -name '*]*.avi'`). Tôi rất vui khi cung cấp một phương thức lệnh unix tiêu chuẩn hạn chế, vì đổi tên không phải, nhưng điều này thổi tôi ra khỏi nước.
Novice C

2

Đây là tất cả các loại không thực tế - các câu trả lời khác nhanh hơn và ngắn hơn nhiều - nhưng ...

Bạn có thể sử dụng PowerShell! Microsoft đã mở nguồn gần đây và làm cho nó đa nền tảng. Để tải xuống và hướng dẫn cài đặt cho HĐH của bạn, hãy xem phần "Nhận PowerShell" .

Khi bạn đã cài đặt xong, bạn có thể sử dụng tập lệnh ngắn gọn này:

Get-ChildItem -File '*]*.avi' | ForEach-Object {
    Rename-Item $_ -NewName (($_.Name -Split ']')[0] + '.avi')
}

Về cơ bản, nó đi qua từng đối tượng trong thư mục hiện tại là một tệp khớp *]*.avi, lấy phần trước dấu ngoặc, xử lý .avilại nó và gán nó làm tên mới.

Để chạy nó trực tiếp từ Bash, hãy sử dụng lớp lót một nửa sân golf này:

powershell -command $'gci -File \'*]*.avi\'|%{rename-item $_ -NewName (($_.Name -Split \']\')[0]+\'.avi\')}'

Trích dẫn thoát lịch sự của câu trả lời Stack Overflow này .

(Đã thử nghiệm với Bash trên Ubuntu trên Windows. Có lẽ cách này ngắn hơn nhiều so với PowerShell, nhưng tôi muốn thể hiện điều gì đó dễ hiểu đối với những người không biết biểu thức thông thường.)


Rube Goldberg sẽ tự hào! Regexes là một PITA thực sự để học, nhưng chúng đáng giá hơn nhiều lần - ngay cả ở cấp độ thô sơ tôi có thể sử dụng chúng tại.
Joe

1

Debian có một gói được gọi là mmv , cũng có thể có sẵn trong các bản phát hành khác và có thể dễ dàng biên dịch từ nguồn nếu không. Nó cho phép bạn viết điều này:

mmv '*]*.avi' '#1.avi'

Bạn có thể đọc trang man Ubuntu cho lệnh này để biết thêm chi tiết.


0

Điều này sẽ tìm kiếm các mẫu và thay thế văn bản bằng cách sử dụng sed.

 $sed 's/\(.*]\)[a-zA-z0-9].*\(.avi\)/\1\2/' filename
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.