Bagaimana cara mengganti nama semua folder dan file menjadi huruf kecil di Linux?

179

Saya harus mengganti nama pohon folder lengkap secara rekursif sehingga tidak ada huruf besar yang muncul di mana saja (itu kode sumber C ++, tapi itu tidak masalah).

Poin bonus untuk mengabaikan file / folder kontrol versi CVS dan Subversion. Cara yang disukai adalah skrip shell, karena shell harus tersedia pada kotak Linux apa pun.

Ada beberapa argumen yang valid tentang perincian penamaan file.

  1. Saya pikir file dengan nama huruf kecil yang sama harus ditimpa; itu masalah pengguna. Ketika diperiksa pada sistem file yang mengabaikan kasus, itu juga akan menimpa yang pertama dengan yang terakhir.

  2. Saya akan mempertimbangkan karakter AZ dan mengubahnya menjadi az, yang lainnya hanya menyerukan masalah (setidaknya dengan kode sumber).

  3. Script akan diperlukan untuk menjalankan build di sistem Linux, jadi saya pikir perubahan pada file kontrol versi CVS atau Subversion harus dihilangkan. Lagi pula, ini hanya checkout awal. Mungkin "ekspor" lebih tepat.

vividos
sumber
Posting sebelumnya akan bekerja dengan baik di luar kotak atau dengan beberapa penyesuaian untuk kasus-kasus sederhana, tetapi ada beberapa situasi yang Anda mungkin ingin mempertimbangkan sebelum menjalankan nama batch: 1. Apa yang harus terjadi jika Anda memiliki dua nama atau lebih di tingkat yang sama dalam hierarki jalur yang hanya berbeda menurut kasus, seperti ABCdef, abcDEFdan aBcDeF? Haruskah script rename dibatalkan atau hanya diperingatkan dan dilanjutkan? 2. Bagaimana Anda mendefinisikan huruf kecil untuk nama yang bukan US-ASCII? Jika nama-nama tersebut mungkin ada, haruskah salah satu memeriksa dan mengecualikan pass dilakukan terlebih dahulu? 3. Jika Anda menjalankan operasi ganti nama
Mihai Limbășan

Jawaban:

179

Versi ringkas menggunakan "rename"perintah:

find my_root_dir -depth -exec rename 's/(.*)\/([^\/]*)/$1\/\L$2/' {} \;

Ini menghindari masalah dengan direktori yang diganti nama sebelum file dan mencoba untuk memindahkan file ke direktori yang tidak ada (misalnya "A/A"ke "a/a").

Atau, versi yang lebih verbose tanpa menggunakan "rename".

for SRC in `find my_root_dir -depth`
do
    DST=`dirname "${SRC}"`/`basename "${SRC}" | tr '[A-Z]' '[a-z]'`
    if [ "${SRC}" != "${DST}" ]
    then
        [ ! -e "${DST}" ] && mv -T "${SRC}" "${DST}" || echo "${SRC} was not renamed"
    fi
done

PS

Yang terakhir memungkinkan lebih banyak fleksibilitas dengan perintah bergerak (misalnya, "svn mv").

Alex B
sumber
36
menggunakan rename bisa dilakukan dengan cara ini juga mengubah nama 'y / AZ / az /' *
Tzury Bar Yochay
3
Hati-hati, kedua versi tidak akan berfungsi pada sistem file case-sensitive. Dalam kasus saya, saya mengganti then-losed baris oleh (mv "${SRC}" "${DST}.renametmp" && mv "${DST}.renametmp" "${DST}") || echo "${SRC} was not renamed".
Lloeki
6
Pendekatan kedua tidak berfungsi dengan benar untuk saya dengan file yang berisi spasi kosong (konteks: linux, bash).
redup
4
Menggunakan versi rename terakhir, tidak diperlukan regex. Perintah penuh menjadi find my_root_dir -depth -exec rename -c {} \;. Tambah -f untuk mengganti nama jika Anda menggunakan sistem file case-insensitive (misal Mac)
Javache
Yang kedua bekerja untuk saya di Solaris dengan menghapus -Tdari mvperintah.
Ham
261

Lebih kecil lagi saya cukup suka:

rename 'y/A-Z/a-z/' *

Jika sistem file tidak sensitif seperti HFS + OS X , Anda perlu menambahkan -fflag:

rename -f 'y/A-Z/a-z/' *
tristanbailey
sumber
3
linux.icydog.net/rename.php :The renaming utility that comes by default with Ubuntu is a Perl program sometimes called prename
sleepsort
1
Terima kasih, saya menggunakannya dengan cara ini $ find | xargs ganti nama 'y / AZ / az /' *
Rashi
5
Ini mengasumsikan Anda memiliki perls ganti nama, yang tidak selalu demikian. mis. pada nama ganti debian saya benar-benar berbeda
Krzysztof Kraso15
10
Di Arch, program ini disebut perl-rename(dan disediakan oleh paket dengan nama yang sama)
jaymmer - Reinstate Monica
3
Ini tidak menjawab masalah yang diberikan karena "ganti nama" tidak rekursif.
Simbolik
89
for f in `find`; do mv -v "$f" "`echo $f | tr '[A-Z]' '[a-z]'`"; done
Swaroop CH
sumber
Silakan lakukan "mkdir -p A / B / C" sebelum menjalankan skrip Anda.
tzot
2
"find" harus diganti dengan perintah apa pun yang Anda gunakan untuk mendapatkan daftar file yang ingin Anda ganti namanya; misalnya, "ls *. {C, CPP, H}".
JPaget
2
Tidak berfungsi pada OS X, hanya mencetak informasi penggunaan untuk find. find .tampaknya memperbaiki ini.
emlai
3
Versi "konsolidasi", dari semua komentar (jawaban tidak dapat diedit lagi):for f in `find .`; do mv -v "$f" "`echo $f | tr '[A-Z]' '[a-z]'`"; done
romaricdrigon
1
Adakah yang bisa menjelaskan kepada saya mengapa ini harus berhasil? Jika ia menemukan ./FOO dan ./FOO/BAR, ia akan berganti nama ./FOO menjadi ./foo, setelah itu ia tidak lagi dapat menemukan ./FOO/BAR. Memasukkan jawaban saya sendiri di bawah ini yang harus memperbaikinya.
oisyn
80

Cukup coba yang berikut ini jika Anda tidak perlu peduli efisiensi.

zip -r foo.zip foo/*
unzip -LL foo.zip
Ginhing
sumber
13
Wow, itu cara yang tidak efisien.
Artjom B.
28
Dengan asumsi bahwa efisiensi komputasi biasanya TIDAK menjadi perhatian ketika Anda merasa perlu mengganti nama file dalam direktori ... Saya pikir ini mungkin solusi paling kreatif yang paling kreatif di utas ini. Sungguh sesuatu yang sepele ini seharusnya tidak serumit jawaban yang diterima menunjukkan dan solusi ini jauh lebih proporsional dengan jumlah pemikiran yang ingin saya investasikan dalam operasi seperti ini. +1000
Peter M. Elias
27
Anda dapat mempercepatnya dengan -0saklar (yang 'nol', tanpa kompresi) zip -0 -r foo.zip foo/,.
Johnny Baloney
3
Saya harus mengubah lebih dari 50.000 nama file dalam struktur direktori yang berbeda. Jawaban asli yang diterima hanya melakukan 10% pekerjaan dalam 2 menit di mana ini, dengan -0kompresi, hampir instan!
Peon
2
Ini bukan hanya tidak efisien. Yang ini tidak mungkin jika tidak ada cukup ruang kosong untuk arsip sementara.
Victor Yarema
19

Sobat, kalian suka hal-hal yang menyulitkan ... Gunakan:

rename 'y/A-Z/a-z/' *
Stephen
sumber
2
Ini tidak berfungsi, katanya file dengan nama huruf kecil sudah ada.
kirhgoff
@kirhgoff Saya pernah melihat itu terjadi dengan NFS mounts - ikuti instruksi di sini .
joebeeson pada
Bagaimana kita bisa mengganti nama pada sistem file case-sensitive? rename 'y/a-z/A-Z/' /tmp/*.jpg-> Can't rename /tmp/*.jpg /TMP/*.JPG: No such file or directory, yaitu, cobalah untuk mengubah nama seluruh path, bukan hanya file.
Pablo A
14

Sebagian besar jawaban di atas berbahaya, karena mereka tidak berurusan dengan nama yang mengandung karakter aneh. Taruhan Anda aman untuk hal semacam ini adalah dengan menggunakan find's -print0pilihan, yang akan mengakhiri nama file dengan ASCII NUL bukan \ n.

Berikut ini skrip, yang hanya mengubah file dan bukan nama direktori agar tidak membingungkan find:

find .  -type f -print0 | xargs -0n 1 bash -c \
's=$(dirname "$0")/$(basename "$0");
d=$(dirname "$0")/$(basename "$0"|tr "[A-Z]" "[a-z]"); mv -f "$s" "$d"'

Saya mengujinya, dan ia bekerja dengan nama file yang mengandung spasi, semua jenis kutipan, dll. Ini penting karena jika Anda menjalankan, sebagai root, salah satu skrip lain di pohon yang menyertakan file yang dibuat oleh

touch \;\ echo\ hacker::0:0:hacker:\$\'\057\'root:\$\'\057\'bin\$\'\057\'bash

... baik tebak apa ...

niXar
sumber
Akan lebih mudah digunakan renamedaripada mv.
Victor Yarema
14

Ini berfungsi jika Anda sudah memiliki atau mengatur perintah rename (mis. Melalui brew install di Mac):

rename --lower-case --force somedir/*
alemol
sumber
9
... jika Anda mengatur ganti nama terlebih dahulu, misalnya melaluibrew install rename
pduersteler
3
ganti nama 'y / AZ / az /' *
Stephen
4
--lower-case? Sayangnya, bukan itu yang terjadi di Arch Linux.
3
renamebukan bash builtin. Ini adalah utilitas eksternal dan sintaks akan berbeda tergantung pada versi yang Anda instal. Jawaban ini tidak cukup sebagai solusi portabel "untuk semua OS berbasis unix" seperti yang diklaim.
Corey Goldberg
2
Baru dicentang, renameperintah yang termasuk dalam Fedora terbaru (28), melalui util-linux-2.31paket, tidak memiliki --lower-caseopsi.
niXar
11

Ini berfungsi pada CentOS / Red Hat Linux atau distribusi lainnya tanpa renameskrip Perl:

for i in $( ls | grep [A-Z] ); do mv -i "$i" "`echo $i | tr 'A-Z' 'a-z'`"; done

Sumber: Ganti nama semua nama file dari huruf besar ke huruf kecil

(Dalam beberapa distribusi, renameperintah default berasal dari util-linux, dan itu adalah alat yang berbeda dan tidak kompatibel.)

Pere
sumber
Ini hanya bekerja pada satu direktori, tidak secara rekursif
Bram
Coool .. Bekerja dengan baik
Manikandan Ram
6

Pendekatan paling sederhana yang saya temukan di Mac OS X adalah dengan menggunakan paket rename dari http://plasmasturm.org/code/rename/ :

brew install rename
rename --force --lower-case --nows *

--Maksa Ganti nama bahkan ketika file dengan nama tujuan sudah ada.

--lower-case Konversi nama file ke huruf kecil semua.

--nows Ganti semua urutan spasi putih dalam nama file dengan karakter garis bawah tunggal.

Kim T
sumber
5

Inilah solusi suboptimal saya, menggunakan skrip Bash shell:

#!/bin/bash
# First, rename all folders
for f in `find . -depth ! -name CVS -type d`; do
   g=`dirname "$f"`/`basename "$f" | tr '[A-Z]' '[a-z]'`
   if [ "xxx$f" != "xxx$g" ]; then
      echo "Renaming folder $f"
      mv -f "$f" "$g"
   fi
done

# Now, rename all files
for f in `find . ! -type d`; do
   g=`dirname "$f"`/`basename "$f" | tr '[A-Z]' '[a-z]'`
   if [ "xxx$f" != "xxx$g" ]; then
      echo "Renaming file $f"
      mv -f "$f" "$g"
   fi
done

Folder semua diganti nama dengan benar, dan mvtidak mengajukan pertanyaan ketika izin tidak cocok, dan folder CVS tidak diubah namanya (file kontrol CVS di dalam folder itu masih diganti namanya, sayangnya).

Karena "find -depth" dan "find | sort -r" keduanya mengembalikan daftar folder dalam urutan yang dapat digunakan untuk penggantian nama, saya lebih suka menggunakan "-depth" untuk mencari folder.

vividos
sumber
Temuan pertama Anda tidak berfungsi. Coba "mkdir -p A / B / C" dan kemudian jalankan skrip Anda.
tzot
4

Pertanyaan aslinya meminta untuk mengabaikan direktori SVN dan CVS, yang dapat dilakukan dengan menambahkan -prune ke perintah find. Misalnya untuk mengabaikan CVS:

find . -name CVS -prune -o -exec mv '{}' `echo {} | tr '[A-Z]' '[a-z]'` \; -print

Saya mencoba ini, dan menyematkan terjemahan huruf kecil di dalam temuan tidak berfungsi karena alasan yang sebenarnya tidak saya mengerti. Jadi, ubah ini menjadi:

$> cat > tolower
#!/bin/bash
mv $1 `echo $1 | tr '[:upper:]' '[:lower:]'`
^D
$> chmod u+x tolower 
$> find . -name CVS -prune -o -exec tolower '{}'  \;

Ian

Ian Dickinson
sumber
4

Menggunakan fixer nama file Larry Wall:

$op = shift or die $help;
chomp(@ARGV = <STDIN>) unless @ARGV;
for (@ARGV) {
    $was = $_;
    eval $op;
    die $@ if $@;
    rename($was,$_) unless $was eq $_;
}

Sesederhana itu

find | fix 'tr/A-Z/a-z/'

(dimana fixtentu saja skrip di atas)

agnul
sumber
3

Ini adalah skrip shell kecil yang melakukan apa yang Anda minta:

root_directory="${1?-please specify parent directory}"
do_it () {
    awk '{ lc= tolower($0); if (lc != $0) print "mv \""  $0 "\" \"" lc "\"" }' | sh
}
# first the folders
find "$root_directory" -depth -type d | do_it
find "$root_directory" ! -type d | do_it

Catat aksi -depth di find pertama.

tzot
sumber
1
Satu-satunya hal yang bekerja pada Mac dari seluruh utas. Terima kasih banyak!
YemSalat
2

Tidak portabel, hanya Zsh, tapi cukup ringkas.

Pertama, pastikan zmvsudah dimuat.

autoload -U zmv

Juga, pastikan extendedglobsudah aktif:

setopt extendedglob

Kemudian gunakan:

zmv '(**/)(*)~CVS~**/CVS' '${1}${(L)2}'

Untuk secara kecil memangkas file dan direktori yang namanya bukan CVS .

benjwadams
sumber
2
for f in `find -depth`; do mv ${f} ${f,,} ; done

find -depthmencetak setiap file dan direktori, dengan isi direktori dicetak sebelum direktori itu sendiri. ${f,,}menurunkan nama file.

Chris Schierkolk
sumber
Ini tidak berfungsi: itu mengganti nama direktori sebelum beroperasi pada konten, sehingga upaya kemudian pada konten gagal.
Pangkas
Menambahkan -depthperbaikan itu! Ini adalah solusi yang sangat cepat, tetapi tentu saja tanpa menggunakan -print0opsi untuk menemukan, itu bukan yang paling dapat diandalkan
jpaugh
@ jpaugh Tidak, tidak. Ini akan mencoba mengubah nama ./FOO/BAR menjadi ./foo/bar, tetapi ./foo belum ada pada saat itu.
oisyn
2

Dengan MacOS,

Instal renamepaket,

brew install rename

Menggunakan,

find . -iname "*.py" -type f | xargs -I% rename -c -f  "%"                       

Perintah ini menemukan semua file dengan *.pyekstensi dan mengonversi nama file menjadi huruf kecil.

`f` - forces a rename

Sebagai contoh,

$ find . -iname "*.py" -type f
./sample/Sample_File.py
./sample_file.py
$ find . -iname "*.py" -type f | xargs -I% rename -c -f  "%"
$ find . -iname "*.py" -type f
./sample/sample_file.py
./sample_file.py
akilesh raj
sumber
Mengapa Anda menggunakan -Iopsi untuk di xargssini?
Victor Yarema
The - Ibendera tidak wajib. Ini digunakan ketika kita menjalankan beberapa perintah xargs. Berikut ini adalah contoh menggunakan beberapa perintah dengan xargs cat foo.txt | xargs -I % sh -c 'echo %; mkdir %' Anda dapat menjalankan tanpa -Isukafind . -iname "*.py" -type f | xargs -I% rename -c -f "%"
akilesh raj
2

Gunakan typeset :

typeset -l new        # Always lowercase
find $topPoint |      # Not using xargs to make this more readable
  while read old
  do new="$old"       # $new is a lowercase version of $old
     mv "$old" "$new" # Quotes for those annoying embedded spaces
  done

Di Windows, emulasi, seperti Git Bash , mungkin gagal karena Windows tidak peka terhadap huruf besar-kecil. Untuk itu, tambahkan langkah mvfile itu ke nama lain terlebih dahulu, seperti "$ old.tmp", dan kemudian ke $new.

Paul Hodges
sumber
1

Panjang Tapi "Bekerja Tanpa Kejutan & Tanpa Instalasi"

Script ini menangani nama file dengan spasi, tanda kutip, karakter dan Unicode yang tidak biasa lainnya , bekerja pada sistem file case sensitif dan sebagian besar lingkungan Unix-y yang memiliki bash dan awk diinstal (yaitu hampir semua). Ini juga melaporkan tabrakan jika ada (meninggalkan nama file dalam huruf besar) dan tentu saja mengubah nama file & direktori dan bekerja secara rekursif. Akhirnya sangat mudah beradaptasi: Anda dapat men-tweak perintah find untuk menargetkan file / dir yang Anda inginkan dan Anda dapat men-tweak awk untuk melakukan manipulasi nama lain. Perhatikan bahwa dengan "menangani Unicode" Maksud saya memang akan mengubah kasus mereka (tidak mengabaikan mereka seperti jawaban yang menggunakan tr).

# adapt the following command _IF_ you want to deal with specific files/dirs
find . -depth -mindepth 1 -exec bash -c '
  for file do
    # adapt the awk command if you wish to rename to something other than lowercase
    newname=$(dirname "$file")/$(basename "$file" | awk "{print tolower(\$0)}")
    if [ "$file" != "$newname" ] ; then
        # the extra step with the temp filename is for case-insensitive filesystems
        if [ ! -e "$newname" ] && [ ! -e "$newname.lcrnm.tmp" ] ; then
           mv -T "$file" "$newname.lcrnm.tmp" && mv -T "$newname.lcrnm.tmp" "$newname" 
        else
           echo "ERROR: Name already exists: $newname"
        fi
    fi    
  done
' sh {} +

Referensi

Skrip saya didasarkan pada jawaban yang sangat bagus ini:

/unix/9496/looping-through-files-with-spaces-in-the-names

Bagaimana cara mengubah string menjadi huruf kecil di Bash?

ndemou
sumber
1

Ini juga berfungsi dengan baik di macOS:

ruby -e "Dir['*'].each { |p| File.rename(p, p.downcase) }"
Chris
sumber
Ini sangat bagus karena Ruby dikirimkan bersama macOS.
jxmorris12
1

Saya perlu melakukan ini pada pengaturan Cygwin pada Windows 7 dan menemukan bahwa saya mendapatkan kesalahan sintaks dengan saran dari atas yang saya coba (walaupun saya mungkin telah melewatkan opsi yang berfungsi). Namun, solusi ini langsung dari forum Ubuntu berhasil :-)

ls | while read upName; do loName=`echo "${upName}" | tr '[:upper:]' '[:lower:]'`; mv "$upName" "$loName"; done

(NB: Saya sebelumnya mengganti spasi dengan menggarisbawahi menggunakan:

for f in *\ *; do mv "$f" "${f// /_}"; done

)

jacanterbury
sumber
1

Di OS X, mv -fmuncul kesalahan "file yang sama", jadi saya ganti nama dua kali:

for i in `find . -name "*" -type f |grep -e "[A-Z]"`; do j=`echo $i | tr '[A-Z]' '[a-z]' | sed s/\-1$//`; mv $i $i-1; mv $i-1 $j; done
Taman Jonghee
sumber
1

Saya akan meraih Python dalam situasi ini, untuk menghindari jalur asumsi tanpa spasi atau garis miring optimis. Saya juga menemukan bahwa python2cenderung dipasang di lebih banyak tempat daripada rename.

#!/usr/bin/env python2
import sys, os

def rename_dir(directory):
  print('DEBUG: rename('+directory+')')

  # Rename current directory if needed
  os.rename(directory, directory.lower())
  directory = directory.lower()

  # Rename children
  for fn in os.listdir(directory):
    path = os.path.join(directory, fn)
    os.rename(path, path.lower())
    path = path.lower()

    # Rename children within, if this child is a directory
    if os.path.isdir(path):
        rename_dir(path)

# Run program, using the first argument passed to this Python script as the name of the folder
rename_dir(sys.argv[1])
John Foley
sumber
Bicara tentang membuatnya rumit ... lakukan saja .. ganti nama 'y / AZ / az /' *
Stephen
1
@Stephen, yang menganggap Anda memiliki akses admin untuk menginstal ganti nama. Saya sering perlu membuat data pada sistem yang saya tidak memiliki kemampuan untuk menginstal perangkat lunak lain. Di Ubuntus baru-baru ini, ini hanya diinstal jika perl hadir.
John Foley
1

Jika Anda menggunakan Arch Linux , Anda dapat menginstal rename) paket dari AURyang memberikan renamexmperintah sebagai /usr/bin/renamexmexecutable dan halaman manual bersama dengannya.

Ini adalah alat yang sangat ampuh untuk mengganti nama file dan direktori dengan cepat.

Konversikan ke huruf kecil

rename -l Developers.mp3 # or --lowcase

Konversi ke kasing kasus

rename -u developers.mp3 # or --upcase, long option

Pilihan lain

-R --recursive # directory and its children

-t --test # Dry run, output but don't rename

-o --owner # Change file owner as well to user specified

-v --verbose # Output what file is renamed and its new name

-s/str/str2 # Substitute string on pattern

--yes # Confirm all actions

Anda dapat mengambil sampel file Developers.mp3 dari sini , jika perlu;)

Peter Mortensen
sumber
1
mengganti nama dari brewpada macOS telah -lterikat untuk menciptakan symlink, dan -cuntuk mengkonversi ke huruf kecil, jadi hati-hati.
rien333
0
( find YOURDIR -type d | sort -r;
  find yourdir -type f ) |
grep -v /CVS | grep -v /SVN |
while read f; do mv -v $f `echo $f | tr '[A-Z]' '[a-z]'`; done

Pertama, ganti nama direktori sortir ke atas -r (di mana -depth tidak tersedia), maka file. Kemudian grep -v / CVS alih-alih menemukan ...- pangkas karena lebih sederhana. Untuk direktori besar, untuk f in ... dapat meluap beberapa buffer shell. Gunakan temukan ... | saat membaca untuk menghindari itu.

Dan ya, ini akan merusak file yang hanya berbeda jika ...

pklausner
sumber
Pertama: find YOURDIR -type d | sort -rterlalu banyak masalah. Kamu ingin find YOURDIR -depth -type d. Kedua, find -type fHARUS dijalankan setelah direktori diubah namanya.
tzot
0
find . -depth -name '*[A-Z]*'|sed -n 's/\(.*\/\)\(.*\)/mv -n -v -T \1\2 \1\L\2/p'|sh

Saya belum mencoba skrip yang lebih rumit yang disebutkan di sini, tetapi tidak ada versi commandline tunggal yang bekerja untuk saya di NAS Synology saya. renametidak tersedia, dan banyak variasi findgagal karena tampaknya tetap menggunakan nama lama dari jalur yang sudah diganti nama (mis., jika ditemukan ./FOOdiikuti oleh ./FOO/BAR, penggantian nama ./FOOke ./fooakan tetap berlanjut ke daftar ./FOO/BARmeskipun jalur itu tidak lagi valid) . Perintah di atas bekerja untuk saya tanpa masalah.

Berikut ini adalah penjelasan dari setiap bagian dari perintah:


find . -depth -name '*[A-Z]*'

Ini akan menemukan file apa pun dari direktori saat ini (ubah .ke direktori apa pun yang ingin Anda proses), menggunakan pencarian kedalaman-pertama (mis., Ia akan mendaftar ./foo/barsebelumnya ./foo), tetapi hanya untuk file yang berisi karakter huruf besar. The -nameFilter hanya berlaku untuk nama file base, bukan path lengkap. Jadi ini akan mencantumkan ./FOO/BARtetapi tidak ./FOO/bar. Ini tidak masalah, karena kami tidak ingin mengganti nama ./FOO/bar. Kami ingin mengubah nama ./FOO, tetapi yang terdaftar nanti (inilah mengapa -depthpenting).

Perintah ini dengan sendirinya sangat berguna untuk menemukan file yang ingin Anda ganti namanya sejak awal. Gunakan ini setelah perintah ganti nama lengkap untuk mencari file yang masih belum diganti karena tabrakan atau kesalahan nama file.


sed -n 's/\(.*\/\)\(.*\)/mv -n -v -T \1\2 \1\L\2/p'

Bagian ini membaca file yang dihasilkan oleh finddan memformatnya dalam mvperintah menggunakan ekspresi reguler. The -npilihan berhenti seddari mencetak input, dan pperintah dalam pencarian dan mengganti output regex teks diganti.

Regex itu sendiri terdiri dari dua tangkapan: bagian atas / terakhir (yang merupakan direktori file), dan nama file itu sendiri. Direktori dibiarkan utuh, tetapi nama file diubah menjadi huruf kecil. Jadi, jika findoutput ./FOO/BAR, itu akan menjadi mv -n -v -T ./FOO/BAR ./FOO/bar. The -npilihan mvmerek yakin ada file huruf kecil tidak ditimpa. The -vpilihan membuat mvoutput setiap perubahan yang membuat (atau tidak membuat - jika ./FOO/barsudah ada, itu output sesuatu seperti ./FOO/BAR -> ./FOO/BAR, mencatat bahwa tidak ada perubahan telah dibuat). Ini -Tsangat penting di sini - ini memperlakukan file target sebagai direktori. Ini akan memastikan bahwa ./FOO/BARtidak dipindahkan ke ./FOO/barjika direktori itu ada.

Gunakan ini bersama-sama dengan finduntuk menghasilkan daftar perintah yang akan dieksekusi (berguna untuk memverifikasi apa yang akan dilakukan tanpa benar-benar melakukannya)


sh

Cukup jelas. Ini merutekan semua mvperintah yang dihasilkan ke shell interpreter. Anda dapat menggantinya dengan bashatau kulit apa pun yang Anda suka.

oisyn
sumber
0

Slugify Rename (regex)

Bukan apa yang diminta OP, tapi apa yang saya harap temukan di halaman ini:

Versi "slugify" untuk mengganti nama file sehingga mirip dengan URL (yaitu hanya menyertakan alfanumerik, titik, dan tanda hubung):

rename "s/[^a-zA-Z0-9\.]+/-/g" filename
cwd
sumber
2
"tidak persis"? ini sama sekali bukan apa yang diminta OP
Corey Goldberg