Перебирайте имена файлов и используйте расширение параметра для преобразования:
for f in *.*.*.txt; do i="${f%.txt}"; echo mv -i -- "$f" "${i//./_}.txt"; done
Шаблон расширения параметра, $ {f //./_}
заменяет все .
с _
в имени файла ( $ f
).
Вышеупомянутое приведет к пробному запуску, чтобы позволить фактическое переименование, удалите echo
:
for f in *.*.*.txt; do i="${f%.txt}"; mv -i -- "$f" "${i//./_}.txt"; done
Если вы хотите иметь дело с любым расширением, а не только с .txt
]:
for f in *.*.*.*; do pre="${f%.*}"; suf="${f##*.}"; \
echo mv -i -- "$f" "${pre//./_}.${suf}"; done
После проверки удалить echo
для фактического действия:
for f in *.*.*.*; do pre="${f%.*}"; suf="${f##*.}"; \
mv -i -- "$f" "${pre//./_}.${suf}"; done
Общий, для произвольного количества точек, по крайней мере, одна:
for f in *.*; do pre="${f%.*}"; suf="${f##*.}"; \
mv -i -- "$f" "${pre//./_}.${suf}"; done
~/.tmux.config
для вызова внешнего скрипта bash в приведенном примере файл находится здесь:~/.tmux_path.sh
set -g status-interval 1
set -g status-right-length 150
set -g status-right "#(~/.tmux_path.sh #{pane_current_path}) %Y-%m-%d %H:%M:%S"
Пример скрипта bash, который читает #{панель _текущий _путь )arg. basename
обрезает начальный путь и отображает только текущий. Это удобно при использовании в качестве идентификатора окна. ПРИМЕЧАНИЕ. :Здесь делается предположение, что $HOME = /home/user
может потребоваться корректировка -f-1,4-
для соответствия желаемому результату.
#!/bin/sh
printf '\033%s\007' $(echo "$1" | awk '{print "~"$1}' | cut -d/ -f-1,4-)
chmod +x ~/.tmux_path.sh
~/.tmux_path.sh
выше set -g status-interval 1
set -g window-status-current-format "[#[fg=white] #(~/.tmux_path.sh #{pane_current_path})]"
set -g window-status-format "#[fg=black] #(~/.tmux_path.sh #{pane_current_path})"