Использование sed
for file in *_*
do
echo mv $file $( sed 's/\(.*\)_/\1\./' <<< $file)
done
Удалите echo
, если вас это устраивает.
Я нашел ответ на этот вопрос на страницах руководства :
S Открыть оболочку в текущем каталоге
Да, вероятно, следует прочитал это, прежде чем спрашивать здесь.
Вы также можете сделать это другим способом и использовать ranger-cd
для автоматического изменения каталога в bash после закрытия ranger с помощью этого сценария .
function ranger-cd {
local IFS=$'\t\n'
local tempfile="$(mktemp -t tmp.XXXXXX)"
local ranger_cmd=(
command
ranger
--cmd="map Q chain shell echo %d > "$tempfile"; quitall"
)
${ranger_cmd[@]} "$@"
if [[ -f "$tempfile" ]] && [[ "$(cat -- "$tempfile")" != "$(echo -n `pwd`)" ]]; then
cd -- "$(cat "$tempfile")" || return
fi
command rm -f -- "$tempfile" 2>/dev/null
}
Ваша оболочка изменяет каталог только тогда, когда вы выходите из рейнджера с заглавной буквой Q (см. карту Q
, если вы хотите это изменить).
Я использую его с
alias r=ranger-cd
Вы можете адаптировать этот сценарий и для других целей, например выйдите из рейнджера и переключитесь на сеанс vim в этом каталоге.
Вы также можете использовать :cd /path/to/folder
, если вы уже находитесь в Ranger.
rangercd () {
tmp="$(mktemp)"
ranger --choosedir="$tmp" "$@"
if [ -f "$tmp" ]; then
dir="$(cat "$tmp")"
rm -f "$tmp"
if [ -d "$dir" ]; then
if [ "$dir" != "$(pwd)" ]; then
cd "$dir"
fi
fi
fi
}
bindkey -s '^o' 'rangercd\n'
Другой подход заключается в том, чтобы базовая оболочка «следила»ranger(1)
за файловой системой, чтобы после перехода в новый каталог и ranger(1)
закрывалась (или приостанавливалась; обычно ctrl + z)базовая оболочка уже будет находиться в том же каталоге ranger(1)
, в котором был завершен выход.
Чтобы сделать это, используйте оболочку "source" ranger(1)
либо предварив команду словом .
(, т. е. символом точки или точки ), либо словомsource
на какие-то ракушки.
. ranger
Теперь ваша оболочка будет "следовать" ranger(1)
по всей файловой системе.
Это работает, потому что команда ranger
(, которая является скриптом Python ), имеет встроенныйbash(1)
скрипт, который считывается при поиске файла. Обратите внимание, что это работает только наbash(1)
совместимых оболочках.
Из блока комментария скрипта:
This embedded bash script can be executed by sourcing this file. It will cd to ranger's last location after you exit it. The first argument specifies the command to run ranger, the default is simply "ranger". (Not this file itself!) The other arguments are passed to ranger.
Если вы предпочитаете использовать ranger(1)
в этом режиме, добавьте его как alias
в сценарий инициализации вашей оболочки.
alias ranger='. ranger'
Мое решение менее причудливое и включает несколько больше движущихся частей, чем другие здесь.
Идея в том,когда пользователь нажимаетS
(типичную привязку для «оболочки» ), сопоставьте ее с командой рейнджера, которая записывает текущий каталог во временный файл.
Затем оберните рейнджер в (, в моем случае zsh
, но он должен работать и с bash
, а также с )функцией оболочки, которая проверяет, существует ли этот временный файл. Если это так, он cd
переходит в этот каталог, а затем удаляет этот файл.
Поскольку функции оболочки выполняются в текущей оболочке, они действительно изменяют ваш текущий каталог.
Хотя это немного сложнее, чем другие ответы здесь, он не оставляет зависшего экземпляра ranger
и работает хорошо.
Итак, в rc.conf
добавляем строку:
map S quit_and_cd
Вcommands.py
(файле, где вы можете создавать пользовательские команды рейнджера ), создайте эту команду:
import os
from ranger.api.commands import Command
class quit_and_cd(Command):
def execute(self):
with open("/tmp/cd_ranger", "w") as f:
f.write(os.path.abspath(self.fm.thisdir.path))
# same as quitall_bang (:quitall!)
self.fm.exit()
Затем при запуске оболочки(.zshrc
или.bashrc
)создайте функцию с именем ranger:
ranger () {
local LOGFILE='/tmp/cd_ranger'
# `command ranger` to launch ranger itself,
# instead of causing an infinite loop with
# this function calling itself
command ranger "$@" || exit $?
if [[ -f "${LOGFILE}" ]]
then
cd "$(cat "${LOGFILE}")"
rm -f "${LOGFILE}"
fi
}