Есть ли способ выполнить команду 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 для получения дополнительной информации о расширении фигурных скобок.
Вы можете использовать псевдоним для короткого имени каталога:
alias src='/directory/name/of/source'
alias dst='/directory/name/of/destination'
mv src dst
Вы можете попробовать:
pushd .
cd /really/long/directory/name/
mv whatever.1 whatever.2
popd
`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
В качестве альтернативы расширению скобок вы можете использовать функции расширения истории оболочки 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?