Как изменить заглавные буквы имени файла на строчные?

% namingthingsishard () { echo; ls; zle redisplay }
% zle -N namingthingsishard                  
% bindkey '^l' namingthingsishard                  
% 

Это связывает control+l , потому что я не знаю, что \M-lгенерирует для вас; запуск read -r, а затем нажатие клавиш может показать что-то подходящее для использования с bindkey, или запуск bindkeyбез аргументов, чтобы показать, что уже установлено. Для получения дополнительной информации о bindkey и виджетах см. zshzle(1).

1
08.08.2019, 15:41
2 ответа

Одной из альтернатив может быть использование rename - Perl extension for renaming multiple files.

Чтобы перевести все имена файлов в нижний регистр:rename 'y/A-Z/a-z/' *

Если вы не хотите устанавливать это, вы можете просто:

for item in *; do
  mv "$item" "${item,,}" 
done
0
27.01.2020, 23:17

Для всех (не -скрытых )файлов в текущем каталоге

В оболочке zshвы можете сделать:

autoload zmv # best in ~/.zshrc
zmv '*' '${(L)f}'

(zmvпрерывается, если есть какой-либо конфликт (, например, файлы FILEи Fileв текущем каталоге )перед выполнением какого-либо переименования ).

(изменить *на *(#q^/), чтобы переименовывать только файлы каталога не -, или *(#q-^/)для файлов каталога не -после разрешения символической ссылки)

Сmmv:

mmv '*' '#l1'

(mmvне будет переименовывать каталоги (даже символические ссылки на каталоги ), если не передана опция -r)

С утилитой Perl renameили любой ее разновидностью (, иногда называемойprename):

rename '$_ = lc $_'./*

zmv, mmvи (некоторые варианты)renameимеют параметр -nдля пробного запуска -прогона и-vподробного параметра, чтобы показать, что делается.

Некоторые варианты renameбудут переводить только буквы ASCII. Некоторые другие, такие как mmv, будут обрабатывать ввод как UTF -8 независимо от локали. zmvбудет корректно переводиться в соответствии с локалью, как и другие подходы, описанные ниже.

В оболочке bash:

for f in *[[:upper:]]*; do
  # [ -f "$f" ] || continue # uncomment to skip non-regular files if needed
  # [ -L "$f" ] && continue # uncomment to also skip symlinks even
                            # if they resolve to regular files
  mv -i -- "$f" "${f,,}"
done

(-iспрашивать перед перезаписью файла, но в момент каждого переименования; некоторые mvреализации поддерживают-vподробные опции, чтобы показать, что делается.Реализация GNU имеет параметр -T, который вы также хотели бы использовать здесь, чтобы mv FOO fooне стал переместите FOO в каталог foo , если в текущем каталоге есть каталог foo). ].

В оболочках ksh, zshи bash:

typeset -l f
for F in *[[:upper:]]*; do
  # [ -f "$f" ] || continue # uncomment to skip non-regular files if needed
  # [ -L "$f" ] && continue # uncomment to also skip symlinks even
                            # if they resolve to regular files
  f=$F
  mv -i -- "$F" "$f"
done

(pdkshи производные переводят только буквы ASCII)

POSIXly (и при условии, что имена файлов не заканчиваются символами новой строки):

tolower() {
  awk 'BEGIN{print tolower(ARGV[1])}' "$1"
}
for f in *[[:upper:]]*; do
  # [ -f "$f" ] || continue # uncomment to skip non-regular files if needed
  # [ -L "$f" ] && continue # uncomment to also skip symlinks even
                            # if they resolve to regular files
  mv -i -- "$f" "$(tolower "$f")"
done

Некоторые awkреализации, такие как mawk, переводят только буквы ASCII.

Рекурсивно (также переименование файлов в подкаталогах -)

(вы все еще можете прочитать предыдущий раздел о предостережениях и соображениях, большинство из которых применимы и здесь)

зш-хzmv:

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

Если имеется большое количество файлов, вы можете ускорить его, запустив zmodload zsh/filesзаранее, что позволит встроенной -версии mv(, используемой zmv, фактически выполнить переименование ).

mmv(только переименование не -каталогов):

mmv ';*' '#1#l2'

С помощью findи perlrename(также переименовываются скрытые файлы и файлы в скрытых каталогах):

find. -depth -name '*[[:upper:]]*' -exec rename '
  s:[^/]+\Z:\L$&:' {} +

POSIXly (также переименование скрытых файлов и файлов в скрытых каталогах):

find. -depth -name '*[[:upper:]]*' -exec sh -c '
  for f do
    dir=${f%/*}
    name=${f##*/}
    newname=$(awk "BEGIN{print tolower(ARGV[1])}" "$name")
    mv -i -- "$f" "$dir/$newname"
  done' sh {} +
4
27.01.2020, 23:17

Теги

Похожие вопросы