Чи є спосіб виконання mvкоманди без введення повного шляху у другому аргументі?
Приклад:
mv my/file/that/has/a/really/long/path/foo.bar some_magic_operator_that_means_the_same_directory/foo.baz
Чи є спосіб виконання mvкоманди без введення повного шляху у другому аргументі?
Приклад:
mv my/file/that/has/a/really/long/path/foo.bar some_magic_operator_that_means_the_same_directory/foo.baz
Відповіді:
Ви можете використовувати розширення дужок 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 для отримання додаткової інформації про розширення брекетів.
Як альтернатива розширенню брекетів, ви можете використовувати функції розширення історії оболонки 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?
`DIR=./really/long/path/mv "$DIR"foo.bar "$DIR"foo.bzВ одному рядку: DIR=./really/long/path/; mv "$DIR"foo.bar "$DIR"foo.bz
cdможете потрапити в каталог, в якому ви хочете працювати:cd ./really/long/pathmv foo.bar foo.bzВ одному рядку: cd ./really/long/path && mv foo.bar foo.bz
&&в цьому останньому одноколірному. В іншому випадку, якщо cdне вдасться, mvзапуск буде запущений у неправильному каталозі, потенційно перезаписавши файл. З cd ./really/long/path && mv foo.bar foo.baz, mvзапускається , лише якщо cdвдасться змінити каталог.
cdдо каталогу, аmvзвідти?