создайте псевдо оболочку для команды

Одна вещь иметь в виду когда дело доходит до подстановочных знаков состоит в том, что они расширены оболочкой. Приложение не знает, использовали ли Вы подстановочные знаки или ввели имена. Например, если Вы вводите 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 (необходимо будет всегда защищать $ в тексте замены).

3
01.01.2013, 21:01
2 ответа

Я предполагаю, что это должно быть выполнимо в 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 в странице справочника) - конечно, возможно заставить его работать, и это не должно даже быть слишком сложно.

1
27.01.2020, 21:32
  • 1
    Вместо /path/to/git Вы могли записать command git –  glenn jackman 01.01.2013, 22:55

Один путь состоял бы в том, чтобы определить псевдонимы для каждой команды мерзавца. Вы могли все еще выполнить обычные команды оболочки; если это не желаемо, установить 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 опция установлена. Я не знаю об ударе.

0
27.01.2020, 21:32

Теги

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