Thay thế tất cả các dấu hai chấm từ tên tệp bằng Terminal


12

Tôi có giá trị âm nhạc của GB trên ổ cứng được định dạng bằng EXT4. Tôi muốn di chuyển các tệp này sang phân vùng ổ cứng định dạng FAT. Tuy nhiên, tôi không thể di chuyển hầu hết các tệp của mình vì chúng có ":" trong tên (Ví dụ: "Act 2: ....." cho các vở opera). Có cách nào với dòng lệnh để đổi tên tất cả các tệp của tôi từ "XXXX: XXXX" thành "XXXX-XXXX" không?

Câu trả lời:


24

Nếu tất cả các tệp của bạn nằm trong một thư mục, hãy thử:

rename 's|:|-|g' *

(trong đó * có thể được thay đổi thành thứ gì đó hạn chế hơn nếu bạn muốn)

Nếu bạn có nhiều tệp trong cây thư mục, hãy thử tệp này từ gốc của cây:

find . -name "*:*" -exec rename 's|:|-|g' {} \;

Bạn có thể thêm tùy chọn -nngay sau đó renameđể nó cho bạn biết những gì nó sẽ làm mà không THỰC SỰ làm nó. Điều này có thể giúp bạn tránh việc vô tình giẫm lên các tệp khác hoặc một cái gì đó xấu ...


1
Giải pháp thư mục đơn sẽ hoạt động nhưng giải pháp lồng nhau sẽ không có nếu thư mục tự có: s trong tên của chúng. Điều này là do trong đầu ra của find .tên của một thư mục con đi trước nội dung của nó. Vì vậy, nếu bạn có một tập tin /1:/2:đầu tiên /1:/sẽ được đổi tên thành /1-/. Bây giờ bạn không thể đổi tên /1:/2:thành /1-/2-/1:/2:không tồn tại.
S Prasanth

1
Đối với thư mục: find . -type d -readable -writable -exec rename 's|:|-|g' {} \;Và sau đó các tệp:find . -type f -readable -writable -exec rename 's|:|-|g' {} \;

@Christopher Lệnh cho các thư mục sẽ thất bại nếu có hai cấp độ thư mục với: trong tên của chúng. Ví dụ: / 1: / 2: / trong đó 2: cũng là một thư mục. Tất nhiên, nếu đây không phải là trường hợp của Ryan, thì nó sẽ hoạt động.
S Prasanth

Đối với nhiều cấp độ của thư mục con sử dụng : for i in {1..20}; do find . -maxdepth $i -mindepth $i -name "*:*" -exec rename 's|:|-|g' {} \;; done. Thay đổi 20 đến độ sâu tối đa của thư mục. kết cấu. Không phải chính xác - có thể lớn hơn. Sẽ mất thời gian nếu được đặt thành một số rất lớn mặc dù.
S Prasanth

0

Tôi không ở máy linux của tôi ngay bây giờ vì vậy tôi chỉ có thể cung cấp thông tin thô.

Linux có một tiện ích dòng lệnh được gọi là renamehoạt động với các đầu vào khác, biểu thức chính quy hoặc biểu thức chính quy. Bạn sẽ có thể sử dụng cùng với biểu thức chính như "s /: / - /" trên các tệp của mình để đạt được tên đổi mà bạn muốn.

Để đảm bảo an toàn, hãy thực hiện theo lô nhỏ và / hoặc thử nghiệm đầu tiên với mô phỏng (đổi tên có một cờ chỉ cung cấp cho bạn tên cũ và tên mới của tệp mà không thực sự đổi tên - trước tiên hãy sử dụng để xác minh)


0

Đây là một giải pháp trong python xử lý trường hợp các tệp không nhất thiết phải trong cùng một thư mục.

import os
torename = []
rootdir = "The main directory"
logfile = "Path to log file" #Eg: logfile = "/home/prasanth/renamelog"
for (path, dirs, files) in os.walk(rootdir):
    for dirname in dirs:
        if ':' in dirname:
            torename.append(os.path.join(path, dirname))
    for filename in files:
        if ':' in filename:
            torename.append(os.path.join(path, filename))

print "No of files/dirs to rename =", len(torename)
a = raw_input("Continue? (y/n) ")
if a == 'y':
    torename.reverse()
    for oldname in torename:
        directory, filename = os.path.split(oldname)
        newname = os.path.join(directory, filename.replace(':', '-'))
        command = 'mv %s %s > /dev/null' % (repr(oldname), repr(newname))
        os.system(command)
        f = open(logfile, 'a')
        f.write(oldname + '\n')
        f.close()
else:
    print "Aborted."
  1. Lưu cái này vào một tập tin (nói) rename.py.
  2. Thay đổi rootdirthư mục ngoài cùng đang được xem xét (Sử dụng tên đường dẫn đầy đủ bắt đầu bằng /. Không có các tốc ký hoặc biến env như ~ được phép). Không cần đặt \ trước các ký tự đặc biệt - ví dụ: nếu đường dẫn ngoài cùng là /.../ Ổ cứng của tôi, hãy đặt rootdir = "/.../My HDD"KHÔNG rootdir = "/.../My\ HDD"(Lưu ý ") Tôi chỉ rõ ràng như vậy vì bạn có thể không quen với python. Không tôn trọng dự định.]
  3. Thay đổi logfilevị trí mong muốn của logfile. Cuối cùng, tệp này sẽ chứa danh sách các tệp được đổi tên - để tham khảo trong tương lai.
  4. Gọi python rename.py.

Cảnh báo: Thực hiện kiểm tra trên một mẫu nhỏ trước khi mạo hiểm toàn bộ GB nhạc.

Chi tiết: Đổi tên được thực hiện từ các tệp trong cùng bên ngoài.


0

Tôi nhận ra đây là một bài viết rất cũ. Giải pháp đệ quy của AeroGT80 rất kỹ lưỡng, nhưng nó khá chậm. Tôi đã có nó chạy trong khoảng nửa giờ trên một máy chủ chậm hơn và nó chỉ hoàn thành được một nửa - tôi nghĩ rằng đó là khoảng 73.000 tệp trong khoảng 300 thư mục con.

Giải pháp bên dưới sẽ hoạt động nhanh hơn nhiều (nó hoạt động trên tất cả các tệp trong một thư mục, thay vì từng tệp một - sử dụng giải pháp không đệ quy của AeroGT80). Vấn đề duy nhất là, nó chỉ đi sâu vào một thư mục (vì vậy nó không hoàn toàn đệ quy như giải pháp của anh ta), nhưng tôi chắc chắn rằng nó có thể được sửa đổi đủ dễ dàng.

#!/bin/bash
for D in *; do
        if [ -d "${D}" ]; then
                #echo "${D}"
                pushd "${D}" > /dev/null
                rename 's|:|-|g' *
                popd > /dev/null
        fi
done
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.