Pertanyaan Ganti Semua Colons Dari Nama File Dengan Terminal


Saya memiliki nilai musik GB di HDD 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 ":" di nama (Misalnya, "Act 2: ....." untuk opera). Apakah ada cara dengan baris perintah untuk mengganti nama semua file saya dari "XXXX: XXXX" menjadi "XXXX-XXXX"?


9
2017-12-10 06:13


asal




Jawaban:


Jika semua file Anda berada dalam satu direktori, coba:

rename 's|:|-|g' *

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

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

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

Anda dapat menambahkan opsi -n tepat setelah rename untuk memilikinya memberitahu Anda apa yang AKAN lakukan tanpa SEBENARNYA melakukannya. Ini mungkin membantu Anda menghindari secara tidak sengaja menginjak file lain atau hal lain yang buruk ...


20
2017-12-10 08:57



Solusi direktori tunggal akan bekerja tetapi solusi bertingkat tidak akan jika direktori itu sendiri memiliki: s dalam nama mereka. Ini karena dalam output find . nama subdirektori mendahului isinya. Jadi, jika Anda memiliki file /1:/2: pertama /1:/ akan diganti namanya menjadi /1-/. Sekarang Anda tidak dapat mengganti nama /1:/2: untuk /1-/2- karena /1:/2: tidak ada. - S Prasanth
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 tingkat direktori dengan: di 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 berbagai tingkat penggunaan sub-dirs: 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 sekalipun. - S Prasanth
bekerja dengan baik, terima kasih! - Stefano Mtangoo


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

Linux memiliki utilitas commandline yang disebut rename yang bekerja dengan antara input lain, ekspresi reguler atau regexes. Anda harus dapat menggunakan itu bersama dengan regex seperti "s /: / - /" pada file Anda untuk mencapai nama yang Anda inginkan.

Untuk amannya, 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)


0
2017-12-10 06:20





Ini adalah solusi dalam python yang menangani kasus di mana file-file tersebut 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. Perubahan rootdir ke direktori terluar yang sedang dipertimbangkan (Gunakan nama path lengkap dimulai dengan /. Tidak ada shorthands atau env variabel seperti ~ diizinkan). Tidak perlu meletakkan \ sebelum karakter khusus - misalnya jika dir paling luar ... / / HDD saya, masukkan rootdir = "/.../My HDD" TIDAK rootdir = "/.../My\ HDD" (Perhatikan "s) [Saya bersikap eksplisit ini hanya karena Anda mungkin tidak terbiasa dengan python. Tidak sopan tidak dimaksudkan.]
  3. Perubahan logfile ke lokasi logfile yang diinginkan. Pada akhirnya, file ini akan berisi daftar file yang diganti namanya - untuk referensi di masa mendatang.
  4. Panggilan python rename.py.

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

Detail: Mengganti nama dilakukan dari file terdalam ke luar.


0
2017-12-10 13:18