Linux python scripting memeriksa direktori yang memiliki nama yang sama tetapi kasus yang berbeda


0

Menggunakan partisi ntfs pada hard drive eksternal di Linux, saya ingin dapat mengganti nama direktori yang memiliki nama yang sama dengan case yang berbeda untuk pengguna disk yang sama di Windows.

Masalahnya adalah bahwa huruf kapital bisa di mana saja dalam nama direktori dan ada huruf kapital di kedua dirs. Saya tahu bagaimana cara mengganti nama direktori tetapi tidak bagaimana memeriksa apakah direktori dengan karakteristik seperti itu akan ada.

Saya telah mengembangkan skrip dengan python untuk menyelesaikan beberapa masalah, oleh karena itu jika solusinya menggunakan python, itu akan lebih baik, tetapi bash juga akan melakukannya.

Sebagai contoh :

fiRstdiRectory
firSTDirectory

Script akan mengganti nama direktori pertama menjadi:

firstdirectory_0

Jawaban:


1

Coba lakukan seperti ini

#!/usr/bin/python
import os

# Collect the names and type (file or directory)
filenames = os.listdir(".")
filetypes = map(lambda x: os.path.isdir(x), filenames)
files = zip(filenames, filetypes)
files = sorted(files, key=lambda x: (x[0].lower(), x[1]))

# Create a set of downcased filenames for quick lookup
files_lower = set()
for f in files:
    files_lower.add(f[0].lower())

previous_name = ""

# Rename the files
for f in files:
    if f[0].lower() == previous_name.lower() and f[1] is True:
        # Find an unused index
        c = 0
        while True:
            f_rename = f[0].lower() + "_" + str(c)
            if f_rename.lower() in files_lower:
                c += 1
            else:
                print("renaming %s to %s" % (f[0], f_rename))
                os.rename(f[0], f_rename)
                files_lower.add(f_rename.lower())
                break
    previous_name = f[0]

Misalkan saya memiliki entri berikut dalam direktori

$ ls -F
a  A/  b/  B/  B_0/  bb/  bB/  Bb/  BB/  c/  d/  D/

Dengan kata lain, mereka semua adalah direktori kecuali untuk "a" yang merupakan file biasa. Menjalankan skrip ini akan memberikan output berikut

renaming A to a_0
renaming b to b_1
renaming Bb to bb_0
renaming bB to bb_1
renaming bb to bb_2
renaming d to d_0

dan direktori sekarang berisi entri-entri berikut

$ ls -F
a  a_0/  B/  B_0/  b_1/  BB/  bb_0/  bb_1/  bb_2/  c/  D/  d_0/

Skrip hanya mengganti nama direktori (Anda menyebutkan bahwa Anda hanya mengganti nama direktori) dan mengonversi nama apa pun yang diubah namanya menjadi semua huruf kecil (berdasarkan pada contoh Anda). Juga berhati-hati untuk tidak mengubah nama direktori menjadi nama yang sudah ada (maka b -> b_1 dalam contoh saya sejak B_0 sudah ada).

Semoga ini berhasil untuk Anda.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.