Як перейменувати всі файли в малі регістри?


123

У мене є, наприклад, TREE.wav, ONE.WAV. Я хочу перейменувати його на tree.wav, one.wav. Як перейменувати всі файли в малі регістри?


1
Вам подобається рішення з терміналом / оболонкою? Або ви хочете, щоб C / Objective-C це досягти?

Рішення на терміналі буде нормально.
Волода2

3
Я думаю, що це слід відновити. термінальний код також є кодом
Danield

1
Це має бути дійсним питанням про stackoverflow. Це також код.
adev

Відповіді:


371

Якщо вам зручно з терміналом:

  1. Відкрийте Terminal.app, наберіть, cdа потім перетягніть папку, що містить файли, які потрібно перейменувати у вікно.
  2. Щоб підтвердити, що ви знаходитесь у правильному каталозі, введіть lsта натисніть клавішу Enter.
  3. Вставте цей код і натисніть Enter:

    for f in *; do mv "$f" "$f.tmp"; mv "$f.tmp" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done
  4. Щоб підтвердити, що всі ваші файли мають малий регістр, введіть lsі знову натисніть клавішу Enter.

(Дякуємо @bavarious на Twitter за кілька виправлень, а також дякую Джону Вітлі нижче за те, що він зробив більш безпечним для файлових систем, що не залежать від регістрів.)


9
Будь обережний. Якщо у вас є файли з ім'ям foo.txtі FOO.TXTце може затирати один з них.
Кіт Томпсон

1
З bash ви можете просто зробити: mv "$f" "${f,,}"абоdeclare -l g=$f; mv "$f" "$g"
glenn jackman

2
Я спробував всі ці команди, я отримую "mv: 'PPP.txt' і 'ppp.txt' - це один і той же файл", і це не малі регістри мого файлу ... будь-які ідеї? Це тому, що його в одному каталозі?
лорл

1
user2066039: Це повинно бути нещодавнє в Mac, тому що більшість відповідей старше року не враховують цього. Я виконав це завдання, використовуючи проміжне розширення типу "jpg1". Отже, JPG -> jpg1 -> jpg. Сподіваюся, що це допомагає.
Джойс

14
Користувачі OS X повинні перейменувати кожен файл на тимчасове ім’я спочатку через нечутливу до регістру файлову систему, наприклад: for f in *; do mv "$f" "$f.tmp"; mv "$f.tmp" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done
Джон Вітлі

10

Задане запитання є загальним, а також важливим, тому я хочу надати більш загальну відповідь:

Найпростіший випадок (безпечний більшу частину часу і на Mac OS X, але читайте далі):

for i in * ; do j=$(tr '[:upper:]' '[:lower:]' <<< "$i") ; mv "$i" "$j" ; done

Вам також потрібно обробити пробіли у назви файлів (будь-яка ОС):

IFS=$'\n' ; for i in * ; do j=$(tr '[:upper:]' '[:lower:]' <<< "$i") ; mv "$i" "$j" ; done

Вам потрібно безпечно обробляти назви файлів, які відрізняються лише залежно від регістру у файловій системі, що відрізняється від регістру, і не перезаписувати ціль (наприклад, Linux):

for i in * ; do j=$(tr '[:upper:]' '[:lower:]' <<< "$i") ; [ -e "$j" ] && continue ; mv "$i" "$j" ; done 

Примітка про Mac OS X:

Файлова система Mac нечутлива до регістру і зберігає регістр.

Однак немає необхідності створювати тимчасові файли, як це пропонується у прийнятій відповіді та коментарях, оскільки дві назви файлів, які відрізняються лише у кожному випадку, не можуть існувати в першу чергу, див .

Щоб показати це:

$ mkdir test
$ cd test
$ touch X x
$ ls -l 
total 0
-rw-r--r--  1 alexharvey  wheel  0 26 Sep 20:20 X
$ mv X x
$ ls -l 
total 0
-rw-r--r--  1 alexharvey  wheel  0 26 Sep 20:20 x

Так - але ваш приклад говорить про те, що ви можете зменшити малі імена файлів, використовуючи "mv X ​​x". Так що я лише прокоментував це.
cpaludan

mojave 10.14.5: # touch X x # ls -la всього 0 -rw-r - r-- 1 корінь кореня 0 24 червня 15:19 X # mv X x mv: "X" і "x" однакові файл # ls -la -rw-r - r-- 1 корінь кореня 0 24 червня 15:19 X
cpaludan

Вибачте за шалене форматування. Так там мені не було доброго.
cpaludan

1
І моє погано - опинився в моєму малині на спільному диску (відформатований hfsplus) - там він не працює. Але локально на моєму комп'ютері це робить.
cpaludan

для я в *; do j = $ (tr '[: верх:]' '[: нижній:]' <<< "$ i"); mv "$ i" "$ j"; працював на мене в Каталіні. Дякую.
Сінан Елдем

2

Версія рибної шкаралупи:

for old in *
    set new (echo $old | tr '[A-Z]' '[a-z]')
    mv $old $new
end
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.