Командний рядок перемістіть файл із довгим шляхом до каталогу, не повторюючи шлях до каталогу


16

Чи є спосіб виконання mvкоманди без введення повного шляху у другому аргументі?

Приклад:

mv my/file/that/has/a/really/long/path/foo.bar some_magic_operator_that_means_the_same_directory/foo.baz


1
З якоїсь причини ви не можете просто cdдо каталогу, а mvзвідти?
зплетан

Я часто буваю виконувати такі команди команд у декількох каталогах у своїй щоденній роботі. Мені часто потрібно виконати кілька команд із заданого батьківського каталогу.
Фінбарр

Якось я виявив, що використовуючи !! (подвійні знаки оклику) в терміналі використовується для запуску останньої виконаної команди. Ви також можете додати параметри / текст до останньої команди, але ніколи не намагалися змінити / видалити текст з останньої команди. Спробуйте, і якщо вам це вдасться, я скину це як відповідь. Удачі!
Geppettvs D'Constanzo

Відповіді:


32

Ви можете використовувати розширення дужок bash. Це:

mv my/file/that/has/a/really/long/path/foo.{bar,baz}

перетвориться на:

mv my/file/that/has/a/really/long/path/foo.bar my/file/that/has/a/really/long/path/foo.baz

а потім mvзапускається з цими двома аргументами. Дивіться http://wiki.bash-hackers.org/syntax/expansion/brace для отримання додаткової інформації про розширення брекетів.


3
Це славно. Я не знав, що ти можеш це зробити.
Фінбарр

5

Як альтернатива розширенню брекетів, ви можете використовувати функції розширення історії оболонки bash :

  • ! вводить розширення історії
  • # позначення події, що позначає поточну команду
  • $ слово позначення, що посилається на останній аргумент

Ви можете виконувати підстановки на розширенні, використовуючи sed-подібний s/pattern/replacementсинтаксис, наприклад

somecommand path/to/foo.bar !#$:s/.bar/.baz

Вих.

$ mv -v somepath/Original/Dir3/SubDir1/foo.bar !#$:s/.bar/.baz
mv -v somepath/Original/Dir3/SubDir1/foo.bar somepath/Original/Dir3/SubDir1/foo.baz
'somepath/Original/Dir3/SubDir1/foo.bar' -> 'somepath/Original/Dir3/SubDir1/foo.baz'

Якщо ви хочете конкретно шлях (наприклад, до mvфайла до зовсім іншого імені, яке не легко отримати шляхом підстановки), ви можете використовувати hмодифікатор:

$ mv -v somepath/Original/Dir3/SubDir1/foo.baz !#$:h/baz.foo
mv -v somepath/Original/Dir3/SubDir1/foo.baz somepath/Original/Dir3/SubDir1/baz.foo
'somepath/Original/Dir3/SubDir1/foo.baz' -> 'somepath/Original/Dir3/SubDir1/baz.foo'

Про інші параметри, включаючи readlineкомбінації клавіш для отримання останнього аргументу, див. Як повторити поточний набраний параметр на консолі bash?



2

Зі змінною

  1. Збережіть каталог у змінній: `DIR=./really/long/path/
  2. використання ходу: mv "$DIR"foo.bar "$DIR"foo.bz

В одному рядку: DIR=./really/long/path/; mv "$DIR"foo.bar "$DIR"foo.bz


Зміна каталогу

  1. Ви також cdможете потрапити в каталог, в якому ви хочете працювати:cd ./really/long/path
  2. потім змініть ім'я файлу: mv foo.bar foo.bz

В одному рядку: cd ./really/long/path && mv foo.bar foo.bz


1
той другий виглядає знайомим ;-)
zpletan

2
Найкраще використовувати &&в цьому останньому одноколірному. В іншому випадку, якщо cdне вдасться, mvзапуск буде запущений у неправильному каталозі, потенційно перезаписавши файл. З cd ./really/long/path && mv foo.bar foo.baz, mvзапускається , лише якщо cdвдасться змінити каталог.
geirha

-3

Ви можете надати псевдонім, щоб скоротити ім'я каталогу:

alias src='/directory/name/of/source'
alias dst='/directory/name/of/destination'
mv src dst

1
-1 alias test='/var/log' ; cd testдає -bash: cd: test: No such file or directory.
зплетан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.