В zsh, zmv
делает это легким. Поместить autoload -U zmv
в Вашем ~/.zshrc
, затем используйте один из нескольких способов указать текст замены для **/*.txt
который соответствует файлам расширению txt
в текущем каталоге и подкаталогах:
zmv '**/*.txt' '$f:r.eml'
zmv '**/*.txt' '${f%.*}.eml'
zmv '(**/)(*).txt' '$1$2.eml'
zmv -w '**/*.txt' '$1$2.eml'
Если у Вас нет zsh, но у Вас есть удар ≥4 или ksh93, можно использовать **
пересекать подкаталоги рекурсивно и затем цикл по соответствиям. Необходимо будет активироваться **
шаблон шарика сначала с shopt -s globstar
в ударе (вставляет его Ваш ~/.bashrc
) или set -o globstar
в ksh (вставляет его Ваш ~/.kshrc
). Это также работает в zsh (никакая предшествующая необходимая установка).
for f in **/*.txt; do mv -- "$f" "${f%.*}.eml"; done
Обратите внимание, что это переименовывает все файлы, не только регулярные файлы. Если у Вас есть каталоги или другие нерегулярные файлы, и Вы хотите оставить их нетронутыми:
zmv -Q '**/*.txt(.)' '$f:r.eml'
for f in **/*.txt; do [[ -f $f ]] && mv -- "$f" "${f%.*}.eml"; done
Без функции оболочки вне POSIX необходимо будет вызвать find
пересекать подкаталоги. Ваше решение является хрупким, потому что оно повреждается на файлах, содержащих обратные косые черты, запаздывающий пробел или новые строки. Можно зафиксировать запаздывающий пробел и проблему обратных косых черт с while IFS= read -r f; do …
но передавая вывод по каналу find
по сути повреждения на новых строках. Использовать -exec
вместо этого. На Linux можно использовать rename
утилита (какой бы ни Ваше распределение несет). На Debian, Ubuntu и производных:
rename 's/\.txt$/.eml/' **/*.txt
find . -name '*.txt' -type f -exec rename 's/\.txt$/.eml/' {} +
На других дистрибутивах пока ни одни из имен файлов не содержат .txt
в середине (потому что rename
заменяет первым вхождением исходной строки):
rename .txt .eml **/*.txt
find . -name '*.txt' -type f -exec rename .txt .eml {} +
Только с функциями POSIX повсюду, вызовите оболочку для выполнения преобразования на имени.
find . -name '*.txt' -type f -exec sh -c 'for f; do mv "$f" "${f%.*}.eml"; done' _ {} +
Если Ваш find
слишком старо для поддержки -exec … +
, необходимо будет вызвать одну оболочку на файл, который делает для более простого но более медленного кода.
find . -name '*.txt' -type f -exec sh -c 'mv "$0" "${0%.*}.eml"; done' {} \;
Вы можете передавать почту в vim, по крайней мере, на моей тестовой системе (RHEL 6.7) это работало.
mail | vim -
команда vim -
говорит vim читать из стандартного ввода
вы должны увидеть вывод, который говорит:
Vim: reading from stdin...
в этот момент просто нажмите номер почтового элемента, который вы хотите прочитать, IE 1
, чтобы прочитать первое сообщение, затем нажмите ctrl-d, чтобы продвинуть его вперед.
Вы можете открыть файл спула почты (обычно / var / spool / mail /
) в vim
, но он будет содержать информацию заголовка, которую вы, вероятно, не знаете. хочу. Лучше всего открыть сообщение в почтовой программе, сохранить сообщение в файл, а затем открыть только что сохраненный файл в vim. У вас по-прежнему будет некоторая информация заголовка, но ее гораздо меньше, чем если бы вы открыли файл спула почты напрямую.
Надеюсь, я правильно отвечу на ваш вопрос, но вы можете использовать клиент электронной почты Mutt и настроить его для использования Vim.
У меня есть следующие строки в моем ~ / .muttrc
, так что я могу нажать F6 при просмотре любого сообщение, чтобы перенаправить его в меньше
.
macro generic <f6> "|less\n" "view with less"
macro index <f6> "|less\n" "view with less"
macro attach <f6> "|less\n" "view with less"
macro pager <f6> "|less\n" "view with less"
IMO, less
- правильный инструмент для этой работы, но если вы настаиваете на vim
, то замените все вхождения less
выше на vim. -
<joost> Do you mean to say that I can read mail with vi too? ;-)
<Joey> Didn't you know that?
<Joey> :r /var/spool/mail/jk
— Seen on #debian-mentors
— Из Linux Fortune(fortune linux
)
Вы можете читать почту из Vim с помощью этой команды:
:r /var/spool/mail/{USER}
" replace {USER} with your username on Linux