Одна вещь иметь в виду когда дело доходит до подстановочных знаков состоит в том, что они расширены оболочкой. Приложение не знает, использовали ли Вы подстановочные знаки или ввели имена. Например, если Вы вводите rename *.txt *.bak
, затем rename
команда видит что-то как rename file1.txt file2.txt existingfile.bak
. Это - недостаточно информации для продолжения.
Я буду иметь дело с вопросом о ls
во-первых, потому что это более просто. Если все, что Вы хотите, является именами соответствия, то Вам не нужно ls
, потому что оболочка уже делает расширение.
echo t*
Если Вы хотите больше информации о файлах, то передаете -d
опция к ls
, сказать этому не перечислять содержание каталогов.
ls -ld t*
Нет никакой стандартной утилиты для переименования файлов, потому что первые системы Unix не шли с тем. Портативный метод для переименования файлов использует цикл и является немного подробным:
for x in *.txt; do mv -- "$x" "${x%.txt}.bak"; done
Существует несколько общих утилит для переименования файлов, ни один из которых, как не гарантируют, будет установлен в данной системе Unix, но все из которых легко установить. Вот основные:
rename
от util-linux
комплект, доступный в каждой невстроенной системе Linux (и больше нигде). На Debian и производных (включая Ubuntu), называют эту команду rename.ul
. При условии, что нет никакого возникновения .txt
кроме заключительного расширения, можно записать
rename .txt .bak *.txt
rename
сценарий Perl, который Debian и производные поставляют как /usr/bin/rename
. Можно переименовать файлы согласно произвольным командам Perl.
rename 's/\.txt\z/\.bak/' *.txt
mmv
, который может переименовать, копия и файлы связей согласно нескольким основанным на имени шаблонам и имеет много опций, касающихся, что происходит, если целевое имя уже существует. Обратите внимание, что необходимо использовать кавычки для защиты подстановочных знаков от расширения оболочкой.
mmv '*.txt' '#1.txt'
zmv
функция zsh, доступная, если и только если Ваша оболочка является zsh. Это может соответствовать произвольным zsh шаблонам (таким образом, можно соответствовать именам файлов согласно произвольным регулярным выражениям, не только подстановочным знакам, и можно соответствовать файлам по другим критериям, таким как даты и размеры). zmv
может также скопировать и связаться.
zmv '(*).txt' '$1.txt'
Если Вы имеете некоторый контроль над машинами, Вы используете, моя рекомендация состоит в том, чтобы использовать zsh в качестве Вашей оболочки (это обладает другими преимуществами по удару), и вставьте эти строки Ваш ~/.zshrc
:
autoload -U zmv
alias zmv='noglob zmv -w'
alias zcp='zmv -C'
alias zln='zmv -L'
alias zsy='zmv -Ls'
noglob
zsh функция, которая говорит оболочке не разворачивать подстановочные знаки в аргументе команды. Таким образом, можно записать zmv *.txt \$1.txt
(необходимо будет всегда защищать $
в тексте замены).
Я предполагаю, что это должно быть выполнимо в git
самостоятельно, но так как я не эксперт мерзавца, я использовал бы в функциях оболочки. В a sh
- совместимый один (например. bash
) можно легко записать вызванную функцию git
который будет вызван вместо git
двоичный файл (стараться использовать полный путь для двоичного файла в функции - или command git
в Bash - для предотвращения нежелательной рекурсии):
function git () {
case "$1" in
"commit")
# do your stuff
/path/to/git ...
;;
*)
# call git binary with the same arguments
/path/to/git "$@"
;;
}
Вы могли использовать просто искажение команды (alias
), но функции дают Вам путь больше гибкости.
Что касается завершения, проверьте свою функциональность завершения оболочки (для bash
искать complete
в странице справочника) - конечно, возможно заставить его работать, и это не должно даже быть слишком сложно.
Один путь состоял бы в том, чтобы определить псевдонимы для каждой команды мерзавца. Вы могли все еще выполнить обычные команды оболочки; если это не желаемо, установить PATH
к несуществующему каталогу. Если Вы хотите выполнить команду оболочки а не команду мерзавца, поместите обратную косую черту перед командой (например. \rm foo
удалить файл).
git_commands=$(COLUMNS=2 git --help --all | sed -n -e '1,/^----/d' -e '1,/^$/p')
for c in $git_commands; do
alias "$c=git $c"
done
В zsh у Вас даже будет завершение, если Вы будете иметь complete_aliases
опция установлена. Я не знаю об ударе.
/path/to/git
Вы могли записатьcommand git
– glenn jackman 01.01.2013, 22:55