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

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

6 ответов

Решение

Если вам удобно с терминалом:

  1. Откройте Terminal.app, введите cd а затем перетащите в окно папку, содержащую файлы, которые нужно переименовать.
  2. Чтобы подтвердить, что вы находитесь в правильном каталоге, введите ls и нажмите ввод.
  3. Вставьте этот код и нажмите Enter:

    for f in *; do mv "$f" "$f.tmp"; mv "$f.tmp" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done
    
  4. Чтобы подтвердить, что все ваши файлы в нижнем регистре, введите ls и нажмите ввод снова.

(Спасибо @bavarious в твиттере за несколько исправлений, и спасибо Джону Уитли ниже за то, что он сделал это более безопасным для нечувствительных к регистру файловых систем.)

Заданный вопрос является общим, а также важным, поэтому я хотел бы дать более общий ответ:

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

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

Вам также нужно обрабатывать пробелы в именах файлов (любой ОС):

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

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

for i in * ; do j=$(echo "$i" | tr '[:upper:]' '[:lower:]') ; [ -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

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

for old in *
    set new (echo $old | tr '[A-Z]' '[a-z]')
    mv $old $new
end

Для тех, кто хочет записать все файлы в текущем каталоге и подкаталогах в нижний регистр:

# lower case all files in current dir & subdirs
for d in ./**/ ; do (cd "$d" &&  for x in ./*/ ; do (cd "$x" && for f in *; do mv "$f" "$f.tmp"; mv "$f.tmp" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done); done); done

#list all directories
for f in ./**/ ; do echo $f; done

# lower case all files in a directory
for x in ./*/ ; do (cd "$x" && for f in *; do mv "$f" "$f.tmp"; mv "$f.tmp" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done); done

Простое решение — использовать команду в цикле for.

      for file in ./* ; do
    mv "$file" "$(tr '[:upper:]' '[:lower:]' <<<"$file")"
done

Вы можете узнать больше оtrкоманда здесь описание команды tr

я думаю, что это лучшее решение.

for i in *; do mv "$i" "${i,,}"; done

проще, короче, аккуратнее

Другие вопросы по тегам