38

Возможный дубликат:
Повторное использование текста в команде bash

Если я хочу переименовать файл на несколько каталогов, как мне избежать повторения пути?

Например:

mv path/to/old_filename.txt path/to/new_filename.txt

Мне интересно, есть ли способ сделать это:

mv path/to/old_filename.txt (?)new_filename.txt

Где (?) будет какой-то способ сказать "в том же каталоге".

5 ответов5

61

Вы можете использовать расширение скобки:mv path/to/{old_filename.txt,new_filename.txt}

Вот ссылка на руководство GNU по расширению фигурных скобок в оболочке bash, которое определяет список замен и говорит bash повторять параметр, используя разные замены каждый раз, когда повторяется.

Например,

a{b,c,dd,e}

будет расширен до

ab ac add ae

Единственное предостережение в том, что расширенные повторения должны быть в состоянии следовать друг за другом в качестве аргументов целевой программы.

26

Ответ Дарта, приведенный выше, является умным, но если вы хотите использовать подход с cd , вы также можете рассмотреть возможность использования подоболочки:

(cd path/to && mv old_filename.txt new_filename.txt)

Поскольку изменение каталога происходит в подоболочке, вы фактически не будете изменять каталоги в вашей интерактивной оболочке.

25

Использование расширения истории bash:

mv path/to/oldfile !#:1:h/newfile

где !#:1:h означает: из текущей строки ("!# "), возьмите первое слово (": 1 "), затем возьмите из него только компонент пути (": h "- заголовок).

9

Еще одна полезная альтернатива, если вы собираетесь выполнять несколько команд в каталоге, это:

pushd /path/to
mv oldfile newfile
...
popd
5

Мне нравится ответ @ Дарта. Вот альтернатива: cd path/to && mv oldfile newfile && cd -

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .