Linux hanya mengganti nama file secara rekursif

1

Saya mencoba mengubah nama secara rekursif semua file dalam direktori dan subdirektori menjadi huruf kecil tetapi membiarkan nama direktori tidak berubah.

Semua contoh yang saya temukan ganti nama file dan direktori menjadi huruf kecil misalnya:

find ./ -depth -exec rename -n 'y/[A-Z]/[a-z]/' {} ";"

dan

find . -type f|while read f; do mv "$f" "$(echo $f|tr '[:upper:]' '[:lower:]')"; done

Bagaimana saya bisa menjaga direktori tidak berubah tetapi mengganti nama semua file?

Don Smythe
sumber
Apa masalah dengan yang kedua? -type fdaftar file biasa saja. Direktori tidak terdaftar.
1
Anda juga dapat menambahkan -type fke findperintah pertama yang bagi saya terlihat cara paling sederhana, jelas dan lebih mudah diingat untuk melakukannya.
The Peach

Jawaban:

2

Anda mendapatkan rename pada nama direktori karena findperintah mengembalikan path lengkap nama file, kemudian perintah rename dilakukan juga berdasarkan nama direktori. Jadi jika Anda memiliki file di direktori DIR1/FILE, itu akan diubah namanya menjadi dir1/filesementara Anda tidak ingin mengganti nama direktori.

Berikut adalah perintah untuk mengganti nama hanya nama file:

find . -type f -exec rename -n 's:([^/]*$):lc($1):e' {} +

Dalam perintah di atas, ([^/]*$)hanya cocok bagian terakhir dari lintasan yang tidak mengandung /sepasang tanda kurung di (...)dalamnya yang menjadikan bagian yang cocok sebagai kelompok yang cocok. Kemudian terjemahkan bagian yang cocok ( $1adalah indeks grup yang pertama kali cocok) menjadi huruf kecil dengan lc()fungsi.

Pada Anda perlu naik -nopsi untuk mengubah nama pada file yang sebenarnya.

-exec ... {} +adalah untuk perintah yang dapat mengambil lebih dari satu file sekaligus (mis cat. stat, ls). File yang ditemukan oleh finddirantai bersama seperti xargsperintah. Ini berarti lebih sedikit forking out dan untuk operasi kecil, dapat berarti percepatan yang substansial. [ jawab oleh @Oli ]

αғsнιη
sumber
Ini masih mengganti nama direktori terakhir di pohon karena iterates sekalipun. Tetapi dapat diperbaiki jika perubahan ke: temukan. -nama "* .type" -exec rename's: ([^ /] * $): lc ($ 1): e '{} +
@ DonSmythe Uh, benar saya merindukan -type f. memperbaikinya. Terima kasih.
αғsнιη