Ganti Semua Colon Dari Nama File Dengan Terminal

12

Saya memiliki nilai musik GB pada HDD saya yang diformat dengan EXT4. Saya ingin memindahkan file-file ini ke partisi HDD yang diformat FAT. Namun, saya tidak dapat memindahkan sebagian besar file saya karena mereka memiliki ":" dalam nama-nama (Misalnya, "Act 2: ....." untuk opera). Apakah ada cara dengan baris perintah untuk mengganti nama semua file saya dari "XXXX: XXXX" menjadi "XXXX-XXXX"?

Ryan McClure
sumber

Jawaban:

25

Jika semua file Anda berada dalam satu direktori, coba:

rename 's|:|-|g' *

(di mana * dapat diubah menjadi sesuatu yang lebih ketat jika Anda mau)

Jika Anda memiliki banyak file di pohon direktori, coba ini dari pangkal pohon:

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

Anda dapat menambahkan opsi -nsegera setelah renameitu memberi tahu Anda apa yang AKAN lakukan tanpa SEBENARNYA melakukannya. Ini mungkin membantu Anda menghindari menginjak file lain atau sesuatu yang buruk ...

AeroGT80
sumber
1
Solusi direktori tunggal akan berfungsi tetapi solusi bersarang tidak akan terjadi jika direktori memiliki: s dalam namanya. Ini karena dalam output find .nama subdirektori mendahului isinya. Jadi jika Anda memiliki file /1:/2:terlebih dahulu /1:/akan diubah namanya menjadi /1-/. Sekarang Anda tidak dapat mengganti nama /1:/2:menjadi /1-/2-karena /1:/2:tidak ada.
S Prasanth
1
Untuk direktori: find . -type d -readable -writable -exec rename 's|:|-|g' {} \;Dan kemudian file:find . -type f -readable -writable -exec rename 's|:|-|g' {} \;
@Christopher Perintah untuk direktori akan gagal jika ada dua tingkatan direktori dengan: dalam nama mereka. Misalnya: / 1: / 2: / di mana 2: juga merupakan direktori. Tentu saja, jika ini tidak terjadi dalam situasi Ryan, maka ini akan berhasil.
S Prasanth
Untuk beberapa tingkat sub-dirs menggunakan: for i in {1..20}; do find . -maxdepth $i -mindepth $i -name "*:*" -exec rename 's|:|-|g' {} \;; done. Ubah 20 ke kedalaman maksimum dir. struktur. Tidak harus tepat - bisa lebih besar. Akan memakan waktu jika diatur ke angka yang sangat besar.
S Prasanth
0

Saya tidak di mesin linux saya sekarang jadi saya hanya bisa memberikan informasi kasar.

Linux memiliki utilitas commandline yang disebut renameyang berfungsi dengan input, ekspresi reguler, atau regex lainnya. Anda harus dapat menggunakannya bersama dengan regex seperti "s /: / - /" pada file Anda untuk mencapai penggantian nama yang Anda inginkan.

Agar aman, lakukan dalam batch kecil dan / atau tes pertama dengan simulasi (ganti nama memiliki bendera yang hanya memberi Anda nama lama dan nama baru file tanpa benar-benar mengganti nama - gunakan ini untuk memverifikasi terlebih dahulu)

Karthik T
sumber
0

Ini adalah solusi dalam python yang menangani kasus di mana file tidak harus dalam direktori yang sama.

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. Simpan ini ke file (katakanlah) rename.py.
  2. Ubah rootdirke direktori terluar yang sedang dipertimbangkan (Gunakan nama jalur lengkap yang dimulai dengan /. Tidak ada singkatan atau variabel env seperti ~ diizinkan). Tidak perlu meletakkan \ sebelum karakter khusus - misalnya jika dir paling luar adalah /.../ HDD saya, masukkan rootdir = "/.../My HDD"TIDAK rootdir = "/.../My\ HDD"(Catat "s) [Saya menjadi eksplisit ini hanya karena Anda mungkin tidak terbiasa dengan python. dimaksudkan.]
  3. Ubah logfileke lokasi file log yang diinginkan. Pada akhirnya, file ini akan berisi daftar file yang diganti namanya - untuk referensi di masa mendatang.
  4. Panggil python rename.py.

Peringatan: Lakukan tes pada sampel kecil sebelum mempertaruhkan seluruh GB musik.

Detail: Mengganti nama dilakukan dari file paling dalam ke luar.

S Prasanth
sumber
0

Saya menyadari ini adalah posting yang sangat lama. Solusi rekursif AeroGT80 sangat menyeluruh, tetapi sangat lambat. Saya menjalankannya sekitar setengah jam di server yang lebih lambat dan hanya selesai setengahnya saja - saya pikir itu sekitar 73.000 file di sekitar 300 sub-direktori.

Solusi di bawah ini akan beroperasi jauh lebih cepat (ini beroperasi pada semua file dalam direktori, daripada setiap file satu-per-satu - menggunakan solusi non-rekursif AeroGT80). Satu-satunya masalah adalah, hanya turun satu direktori (jadi tidak sepenuhnya rekursif seperti solusinya), tapi saya yakin itu bisa dimodifikasi dengan cukup mudah.

#!/bin/bash
for D in *; do
        if [ -d "${D}" ]; then
                #echo "${D}"
                pushd "${D}" > /dev/null
                rename 's|:|-|g' *
                popd > /dev/null
        fi
done
Adam Plocher
sumber