Как переименовать файл в папке с помощью команды оболочки?

8

У меня есть файл на some/long/path/to/file/myfiel.txt.

Я хочу переименовать его в some/long/path/to/file/myfile.txt.

В настоящее время я делаю это mv some/long/path/to/file/myfiel.txt some/long/path/to/file/myfile.txt, но ввод пути дважды не очень эффективен (даже с завершением табуляции).

Как я могу сделать это быстрее? (Я думаю, что могу написать функцию для изменения только сегмента имени файла, но это план Б).

Леонид Шевцов
источник

Ответы:

11

Чтобы сделать это в одной команде, вы можете просто сделать это:

mv some/long/path/to/file/{myfiel.txt,myfile.txt}

Вот пример для полного имени файла, учитывая, что это опечатка, вы можете сделать что-то вроде:

mv some/long/path/to/file/myfi{el,le}.txt

Оба расширятся до полной команды, они называются расширениями скобок . Они поддерживаются Zsh .

Тамара Вийсман
источник
О, это открывает так много возможностей. Спасибо!
Леонид Шевцов
5

Вот несколько вариантов:

Перейдите в каталог:

cd /home/long/path
mv file1 file2
cd -

Изменить каталоги, используя стек каталогов:

pushd /some/long/path
mv file1 file2
popd

Перейдите в каталог с помощью подоболочки:

( 
  cd /some/long/path
  mv file1 file2
)   # no need to change back

Используйте расширение скобки:

mv /some/long/path/{file1,file2}

Используйте переменную:

D=/some/long/path
mv "$D/file1" "$D/file2"
tylerl
источник
Помните, что последний подход нарушается, когда у пути есть пробел, цитируйте его лучше.
slhck
@slhck ВСЕ подходы ломаются, если у вас есть пробелы.
Tylerl
1
Нет, если вы введете их правильно, они не будут. Только расширенная переменная будет выглядеть как несколько аргументов для mv
slhck
@ вот так.
Tylerl
3

Перейдите в каталог, переместите файл и вернитесь в предыдущий каталог; вот так:

cd some/long/path/to/file
mv myfiel.txt myfile.txt
cd -
Yedric
источник
1

Когда я использую метод subshell, я склонен делать это в одной строке, например

(cd /some/long/path ; mv myfiel myfile )
Кит Уолтерс
источник