Làm thế nào để dọn sạch phần mở rộng tập tin?


9

Tôi có một thư mục chứa các tệp .MP3 mà tôi muốn thay đổi các phần mở rộng thành .mp3. Cách dễ nhất để làm điều này là gì? Tôi nghĩ một cái gì đó dọc theo dòng:

find /RootPath -type f -iname "*.mp3" -exec mv {} sed s/.*MP3/\1.mp3/ \; 

... mặc dù tôi biết điều đó không hoàn toàn đúng. :) thay là không đúng và tôi không chắc chắn làm thế nào để sử dụng cả mvvà một sedlệnh với -exectrong find.

Tôi có cần một kịch bản bash cho việc này không?

Câu trả lời:


12

Đây là một cách để làm điều này trong Bash:

for i in *; do [ "${i/%MP3/mp3}" != "$i" ] && echo "$i" "${i/%MP3/mp3}"; done

Tôi đã sử dụng echoở đây để lệnh tự nó không làm gì ngoài việc in các cặp tên tệp. Nếu danh sách đó đại diện cho những thay đổi bạn muốn thực hiện, thì bạn có thể thay đổi echothành thứ gì mv -i --đó sẽ di chuyển tệp của bạn (và nhắc bạn trước khi ghi đè).

Giải thích ngắn gọn:

Các forlặp qua từng tập tin phù hợp bằng *. Sau đó, chúng tôi xác định xem tiện ích mở rộng đã là chữ thường hay chưa, nếu chúng tôi tiếp tục, nếu không, chúng tôi sẽ tiến hành di chuyển nó (hoặc lặp lại, như trường hợp có thể). Điều này sử dụng các hoạt động chuỗi tích hợp của Bash mà bạn có thể đọc về đây: http://tldp.org/LDP/abs/html/opes-manipulation.html


Cảm ơn câu trả lời của bạn và chỉ cho tôi một liên kết về thao tác chuỗi bash!

7

Trong zsh:

autoload zmv
zmv '(*).MP3' '$1.mp3'   # rename files in the current directory only
zmv '(**/)(*).MP3' '$1$2.mp3'  # rename files in subdirectories as well

Để chăm sóc .Mp3hoặc .mP3tập tin:

zmv '(**/)(*).(#i)mp3' '$1$2.mp3'

6

Bạn có thể sử dụng lệnh đổi tên (coi chừng có hai triển khai chính với các API khác nhau) cho các lệnh đó. Ví dụ: để thay đổi trường hợp mở rộng tên tệp từ trên xuống dưới, hãy thử điều này:

  • với renametừ util-linux(đôi khi được gọi rename.ul), giả sử .JPGchỉ xảy ra một lần trong tên tệp

    rename -- .JPG .jpg *.JPG
  • với renametừ perl(đôi khi được gọi prename; một số biến thể đã được xuất bản):

    rename 's/\.JPG$/.jpg/' ./*.JPG

Dưới đây là một số kẻ hướng dẫn về cách anh ta chuyển từ một tập lệnh bash lộn xộn sang lệnh đơn giản này cho chính xác trường hợp sử dụng của bạn.

Một lệnh ưa thích khác để làm điều này là pax. Nếu bạn đang sử dụng ZSH cho hệ vỏ của mình, bạn cũng có thể sử dụng zmv.


siêu! chính xác những gì tôi cần
JoshP

Tôi gặp lỗi syntax error at (user-supplied code), near ".", khi tôi chạy lệnh này.
Ryan Gates

3

Sử dụng perl-rename , dao quân đội swiss của đổi tên tệp với các biểu thức thông thường (trên ubfox, gói này được gói cùng với gói perl dưới dạng prename):

# Replace prename as appropriate (i.e. if you've got it installed under a different name
find /RootPath -type f -iname '*.mp3' -print0 | xargs -0 prename 's/mp3$/mp3/i'

Nếu bạn thuộc loại cẩn thận, hãy sử dụng các tùy chọn -n và -v để đổi tên để xem những gì nó thực sự sẽ làm.


Cảm ơn câu trả lời của bạn. Đừng có perlrename trên máy chủ, nhưng hôm nay tôi sẽ chơi xung quanh nó với nó!

0

Bạn cần một tập lệnh, bởi vì "phần mở rộng" trong Linux thực sự chỉ là một phần của chuỗi tên tệp. Bạn phải thực hiện một số thao tác chuỗi trong tập lệnh để có được tên mới.

#!/bin/bash
for NAME in *.JPG
do
    PREFIX=${NAME%.*}
    NEWNAME="$PREFIX.jpg"
    mv "$NAME" "$NEWNAME"
done

Trích dẫn kép rất quan trọng nếu bạn có tên tệp có khoảng trắng trong đó. Tôi nghĩ rằng một số trích dẫn đôi là một chút không rõ ràng.


1
Không có gì sai khi nói với kịch bản của bạn nhưng bạn rất không cần một kịch bản cho việc này. Có lẽ có hàng tá cách để làm điều đó trên một dòng trong hầu hết các shell, và rất nhiều tiện ích để làm cho nó cũng dễ dàng.
Caleb

0

Trong bash:

# renaming files in the current directory only
for f in *.MP3; do mv "$f" "${f%.MP3}.mp3"; done  

# renaming files in subdirectories as well
for f in *{,/*}.mp3; do mv "$f" "${f%.MP3}.mp3"; done

0

đầu tiên sao lưu các tập tin của bạn! bạn có thể sử dụng một lớp lót python:

python -c "import glob,os; [os.rename(fn, fn.replace('.MP3', '.mp3')) for fn in glob.glob('PATH_TO_YOUR_DIRECTORY')]"

BIÊN TẬP:

Dưới đây là một lời giải thích chi tiết về cách thức hoạt động của một lớp lót. Sử dụng python -cchúng tôi đang chuyển một lệnh cho trình thông dịch python. Sau khi nhập các thư viện oscho renamehàm và globđể liệt kê tệp, chúng ta cần lặp qua danh sách tệp trong thư mục đã cho, mà tôi đã gọi PATH_TO_YOUR_DIRECTORY, ví dụ như một cái gì đó giống như ./*cho mọi thứ trong thư mục hiện tại.

Trong cú pháp một lớp không may, forcác vòng lặp không hoạt động sau importký hiệu, vì vậy chúng ta cần sử dụng ký hiệu ngoặc. Tức là đối với mỗi tên tệp hoặc thư mục globđang cung cấp cho chúng tôi từ đường dẫn đã cho dưới dạng chuỗi, chúng tôi thay thế * .MP3 thành * .mp3.

Vì OP không đề cập đến tìm kiếm đệ quy, tôi đã không đưa nó vào vị trí đầu tiê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.