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


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"

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

@slhck ВСЕ подходы ломаются, если у вас есть пробелы.
Tylerl

1
Нет, если вы введете их правильно, они не будут. Только расширенная переменная будет выглядеть как несколько аргументов для mv
slhck

@ вот так.
Tylerl

3

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

cd some/long/path/to/file
mv myfiel.txt myfile.txt
cd -

1

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

(cd /some/long/path ; mv myfiel myfile )
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.