% namingthingsishard () { echo; ls; zle redisplay } % zle -N namingthingsishard % bindkey '^l' namingthingsishard %
Это связывает control+l , потому что я не знаю, что
\M-l
генерирует для вас; запускread -r
, а затем нажатие клавиш может показать что-то подходящее для использования сbindkey
, или запускbindkey
без аргументов, чтобы показать, что уже установлено. Для получения дополнительной информации о bindkey и виджетах см.zshzle(1)
.
Одной из альтернатив может быть использование rename - Perl extension for renaming multiple files
.
Чтобы перевести все имена файлов в нижний регистр:rename 'y/A-Z/a-z/' *
Если вы не хотите устанавливать это, вы можете просто:
for item in *; do
mv "$item" "${item,,}"
done
В оболочке 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
и perl
rename
(также переименовываются скрытые файлы и файлы в скрытых каталогах):
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 {} +