Есть ли способ выполнить 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 :
!
вводит расширение истории#
Событие целеуказатель, обозначающее текущую команду$
Слово целеуказатель со ссылкой на последний аргумент Вы можете выполнить подстановку расширения с использованием СЭД-подобный s/pattern/replacement
синтаксис , например ,
somecommand path/to/foo.bar !#$:s/.bar/.baz
Ex.
$ 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/path
mv 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
оттуда?