Как мне переименовать все файлы в нижний регистр?

123

У меня например TREE.wav, ONE.WAV. Я хочу переименовать его в tree.wav, one.wav. Как мне переименовать все файлы в нижний регистр?

Voloda2
источник
1
Довольны ли вы решением терминала / оболочки? Или вы хотите, чтобы для этого был код C / Objective-C?
Терминальное решение будет в порядке.
Voloda2
3
Я думаю, что это нужно открыть снова. код терминала также является кодом
Даниилд
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 в твиттере за несколько исправлений и спасибо Джону Уитли ниже за то, что сделал это более безопасным для файловых систем без учета регистра.)

WJL
источник
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' - это один и тот же файл», и это не строчная буква моего файла ... есть идеи? Это потому, что он находится в том же каталоге?
lorless 08
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 не чувствительна к регистру и сохраняет регистр.

Однако нет необходимости создавать временные файлы, как это предлагается в принятом ответе и комментариях, потому что два имени файла, которые различаются только регистром, не могут существовать в первую очередь, ref .

Чтобы показать это:

$ 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 total 0 -rw-r - r-- 1 root root 0 24 июня, 15:19 X # mv X x mv: 'X' и 'x' одинаковы файл # ls -la -rw-r - r-- 1 root root 0 24 июн, 15:19 X
cpaludan
Извините за дерьмовое форматирование. ТАК не был добр ко мне там.
cpaludan
1
И мой недостаток - был в ssh на моей малине на общем диске (отформатирован hfsplus) - там не работает. Но локально на моем Mac это так.
cpaludan
для i в *; do j = $ (tr '[: upper:]' '[: lower:]' <<< "$ i"); mv "$ i" "$ j"; работал у меня в каталине. Спасибо.
Синан Эльдем
2

Версия рыбьей раковины:

for old in *
    set new (echo $old | tr '[A-Z]' '[a-z]')
    mv $old $new
end
Арсениус
источник