TL, DR: добавить . / etc / bash_completion
в ваш .bashrc
.
Чтобы ответить на вопрос, который вы задали, таких встроенных команд не существует. В Bash есть команды для завершения различных типов объектов (имена файлов, имена пользователей, имена переменных и т. Д.), Но не те, которые ограничиваются каталогами.
Однако, если вы не используете антикварную версию bash, вы можете использовать контекстно-зависимое завершение , функцию, добавленную в версии 2.04, выпущенной в 2000 году. Некоторые дистрибутивы включают ее по умолчанию; для других вам необходимо установить пакет bash-completion
и активировать его в вашем ~ / .bashrc
. Большинство дистрибутивов предоставляют пакет под названием bash-completion
и помещают сценарий активации в / etc / bash_completion
, то есть ваш .bashrc
должен содержать строку
. /etc/bash_completion
после это, если вы введете cd
и нажмете Tab , будут добавлены только имена каталогов.
Если у вас не древняя версия bash (≥4.0), вы можете поместить shopt -s autocd
в свой .bashrc
, а после этого вы можете опустить cd
, поэтому вы можете написать только bar
вместо cd bar
. Завершение табуляции завершит имена команд из $ PATH
и имена каталогов из текущего каталога (и $ CDPATH
) в первом слове строки.
Баш 4.0 также позволяет вам писать свои собственные функции редакции командной строки (более ранние версии вроде бы делали это, но вам приходилось перепрыгивать через обручи). Так что, если вы действительно хотите, вы можете это сделать. Как настроить завершение команд Bash? содержит относительно сложный пример; найдите READLINE_LINE
и завершите
, чтобы найти другие примеры.
Похоже, что вы забыли передать файлы в rename
.
rename 456 555 *456*
С помощью только shell, используя расширение параметров:
for f in *456*; do echo mv -i -- "$f" "${f//456/555}"; done
здесь мы перебираем файлы, имеющие в имени 456
, а шаблон расширения параметров ${f//456/555}
заменит все подстроки 456
в имени файла на 555
.
Выше показано, как будет выполняться команда mv
, вы можете удалить echo
, чтобы действие было выполнено:
for f in *456*; do mv -i -- "$f" "${f//456/555}"; done
с rename
(prename
):
rename -n 's/456/555/g' *456*
это заменит все (g
) 456
подстроки из имен файлов на 555
(s/456/555/
).
-n
выполнит пробный запуск, если вас устраивают изменения, удалите -n
, чтобы произошло фактическое переименование:
rename 's/456/555/g' *456*
which -a rename
Сообщит вам, есть ли инструменты переименования в вашем $PATH.
rename 's/456/555/g' *
Это предпочтительный синтаксис для выполнения того, что вы хотите (Как указано в руководстве). Если у вас нет или есть старая версия rename без regex, просто скачайте (official) prename Это perl
скрипт, который используют системы типа debian.
(Перемещено из вопроса, предназначенного для ответа здесь)
Я нашел ответ на свой вопрос:
#! /bin/csh -f
#----------------------------------------------------------------------
# Script Name: moveme Date: 05/07/96
# Written by: John W. Woolsey Rev: 10/11/99
#
# Description:
# Renames a set of files that contain a particular search string
# to file names that contain a replacement string.
#
# Syntax: moveme <search_string> <replace_string>
#
# Where:
# <search_string> is the name of the file name search string.
# <replace_string> is the name of the file name replace string.
#----------------------------------------------------------------------
#
onintr catch
if ($#argv != 2) goto syntax
ls -d *$1* | sed "s/\(.*\)\$1\(.*\)/mv & \1$2\2/" | sh
exit 0
syntax:
echo "Syntax: `basename $0` <search_string> <replace_string>"
exit 1
catch:
echo "`basename $0` was interrupted or terminated abnormally."
exit 1