Довольны ли вы решением терминала / оболочки? Или вы хотите, чтобы для этого был код C / Objective-C?
Терминальное решение будет в порядке.
Voloda2
3
Я думаю, что это нужно открыть снова. код терминала также является кодом
Даниилд
1
Это должен быть правильный вопрос о stackoverflow. Это тоже код.
adev
Ответы:
371
Если вас устраивает терминал:
Откройте Terminal.app, введите cdи перетащите папку, содержащую файлы, которые нужно переименовать, в окно.
Чтобы убедиться, что вы находитесь в правильном каталоге, введите lsи нажмите Enter.
Вставьте этот код и нажмите Enter:
for f in*;do mv "$f""$f.tmp"; mv "$f.tmp""`echo $f | tr "[:upper:]" "[:lower:]"`";done
Чтобы убедиться, что все ваши файлы в нижнем регистре, введите lsи снова нажмите Enter.
(Спасибо @bavarious в твиттере за несколько исправлений и спасибо Джону Уитли ниже за то, что сделал это более безопасным для файловых систем без учета регистра.)
Быть осторожен. Если у вас есть файлы с именами 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
Ответы:
Если вас устраивает терминал:
cd
и перетащите папку, содержащую файлы, которые нужно переименовать, в окно.ls
и нажмите Enter.Вставьте этот код и нажмите Enter:
ls
и снова нажмите Enter.(Спасибо @bavarious в твиттере за несколько исправлений и спасибо Джону Уитли ниже за то, что сделал это более безопасным для файловых систем без учета регистра.)
источник
foo.txt
иFOO.TXT
, это может сбить с толку один из них.mv "$f" "${f,,}"
илиdeclare -l g=$f; mv "$f" "$g"
for f in *; do mv "$f" "$f.tmp"; mv "$f.tmp" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done
Заданный вопрос является общим и также важным, поэтому я хочу дать более общий ответ:
Самый простой случай (безопасный большую часть времени и в Mac OS X, но читайте дальше):
Вам также необходимо обрабатывать пробелы в именах файлов (в любой ОС):
Вам необходимо безопасно обрабатывать имена файлов, которые различаются только регистром в файловой системе с учетом регистра, и не перезаписывать целевые файлы (например, Linux):
Примечание о Mac OS X:
Файловая система Mac не чувствительна к регистру и сохраняет регистр.
Однако нет необходимости создавать временные файлы, как это предлагается в принятом ответе и комментариях, потому что два имени файла, которые различаются только регистром, не могут существовать в первую очередь, ref .
Чтобы показать это:
источник
Версия рыбьей раковины:
источник