Пакетные расширения файлов в нижнем регистре [дубликат]

Это действительно интеграция с iTerm2. Вместо того, чтобы удалять его, просто сделайте то, что авторы iTerm2 должны были сделать внутри своего скрипта интеграции.

Я подключался по ssh через linux и подтверждаю, что исходное решение оказалось недостаточным. I

Существует последовательность ANSI, на которую будет реагировать iterm, которая работает независимо от того, какая оболочка/ssh активна. Для тех, кто хочет создать свою собственную последовательность: printf '\x1b[1337n' . Я не знаю, почему сценарий интеграции с оболочкой iterm сам не выполняет этот запрос и не освобождается, если он не размещен в iterm.

В вашем .bashrc (или любой другой оболочке, которую вы используете) должно быть что-то вроде:

test -r ~/.iterm2_shell_integration.bash && . ~/.iterm2_shell_integration.bash

Возможно, без начального теста. Просто измените его на еще более уродливый:

isiterm2.sh && test -r ~/.iterm2_shell_integration.bash && . ~/.iterm2_shell_integration.bash

Исходный скрипт isiterm2.sh (написанный автором iTerm2 gnachman, можно найти здесь на github. Ссылка в приведенном выше блоке кавычек является модификацией исходного скрипта со следующими небольшими изменениями:

  • Добавьте перенаправление на dev null для команды, которая в некоторых случаях может иметь выходные данные
  • Переключите escape-последовательности на echo -ne \x, чтобы их можно было распечатать ascii
  • Под залог Msys bash/git, пока я не выясню, почему stty делает его сварливым

Это мой первоначальный неполный ответ

[[ $TERM_PROGRAM == "iTerm.app" ]] && test -r ~/.iterm2_shell_integration.bash && . ~/.iterm2_shell_integration.bash

TERM_PROGRAM устанавливается как OS X Terminal, так и iTerm2.

0
20.05.2017, 00:39
3 ответа

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

for f in *.JPG
do
  mv "$f" "${f%.JPG}.jpg"
done

Для более общего случая:

for f in *
do 
  e="${f##*.}"
  b="${f%.*}"
  mv "$f" "${b}.${e,,}"
done

Где тяжелая работа выполняется с расширением переменной bash to:

  • сохранить расширение (удалить как можно больше в начале имени файла, пока не будет найдена точка)
  • сохранить остальную часть имени файла (удалить точку в конце имени файла) , минимально)
  • переименуйте файл в новое имя файла, в нижнем регистре расширение (,,) в процессе
7
28.01.2020, 02:16
rename ' -f and /[A-Z][^.]*$/ and s/\.[^.]+$/\L$&/' *

rename ' -f and s/\.[^.]*[A-Z][^.]*$/\L$&/' *

Нам нужно понять, что под капотом rename — это всего лишь код Perl.Думайте об этом так: подстановочный знак * передает имена этому коду в цикле, и над каждым из этих имен мы выполняем следующие действия:

  • Проверяем, является ли текущее имя ( хранится в контейнере цикла $_) — это обычный файл (оператор проверки файла -f имя файла, если имя файла опущено, по умолчанию используется значение $_ ) : Чтобы переименовать не подумал, что -f, который мы хотим для нашего файла-теста, является опцией, мы используем пробел перед -f, чтобы предотвратить такая возможность!!!
  • Было бы бессмысленно выполнять переименование, если имя файла не содержало ни одного символа (символов) верхнего регистра. Таким образом, мы проверяем этот факт в расширении имени файла с помощью этого регулярного выражения: /[AZ][^.]*$/ Это смотрит на непрерывный ряд неточечных символов, видимых с конца имени файла. чтобы утверждать, что в расширенной части имени файла присутствует хотя бы одна прописная буква. Может случиться так, что о расширении не может быть и речи. Об этом факте позаботятся на следующем шаге, где мы ищем литерал . в имени файла.
  • Теперь мы знаем, что текущее имя файла является обычным файлом И является кандидатом на переименование из-за наличия хотя бы одной буквы в верхнем регистре. Регулярное выражение s/\.[^.]+$/\L$&/ изолирует полную часть расширения в текущем имени файла, глядя с конца имени файла и глядя влево и захватывая все не-точки [^.]+ символов до литерала \. .\L$& превратит все прописные буквы в нижний регистр в соответствующем тексте.
  • Я добавил вторую версию, в которой мы выполняем всю работу в одной команде s/// по проверке верхнего регистра в расширении.
  • Специальное примечание: m// и s/// обычно запускаются для прикрепленной строки с помощью оператора =~, например, $var =~ m/[AZ]+/ $filenm =~ s/ABC/DEF/. Но в случае, если рассматриваемая переменная оказывается $_, тогда мы можем обойтись без =~ и написать просто m/[AZ]+/ s/ABC/DEF/ будет означать, что переменная, с которой работают эти регулярные выражения, — это $_. Кроме того, мы можем обойтись без m в случае m//, когда разделителями являются косые черты. Однако нам это нужно в случае, скажем, m{} m|| и т. д. Это очень распространенная идиома в стиле Perl.
2
28.01.2020, 02:16

Просто чтобы добавить еще один ответ, которого еще нет в списке:

for f in *.JPG; do mv "$f" "${f//JPG/jpg}"; done
2
28.01.2020, 02:16

Теги

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