Изменить часть имени файла для нескольких файлов в каталоге:

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 и завершите , чтобы найти другие примеры.

3
26.11.2018, 12:05
4 ответа

Похоже, что вы забыли передать файлы в rename.

rename 456 555 *456*
0
27.01.2020, 21:37

С помощью только 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*
2
27.01.2020, 21:37
which -a rename

Сообщит вам, есть ли инструменты переименования в вашем $PATH.

rename 's/456/555/g' *

Это предпочтительный синтаксис для выполнения того, что вы хотите (Как указано в руководстве). Если у вас нет или есть старая версия rename без regex, просто скачайте (official) prename Это perl скрипт, который используют системы типа debian.

0
27.01.2020, 21:37

(Перемещено из вопроса, предназначенного для ответа здесь)

Я нашел ответ на свой вопрос:

#! /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
0
27.01.2020, 21:37

Теги

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