Переместить файл командной строки с длинным путем к каталогу без повторения пути к каталогу


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оттуда?
zpletan

В своей повседневной работе я часто выполняю команды такого рода в нескольких каталогах. Мне часто нужно выполнить несколько команд из данного родительского каталога.
Finbarr

Каким-то образом я обнаружил, что с помощью !! (двойной восклицательный знак) в терминале используется для запуска последней выполненной команды. Вы также можете добавить параметры / текст в последнюю команду, но никогда не пытались изменить / удалить текст из последней команды. Попробуйте, и если вам это удастся, я оставлю это как ответ. Удачи!
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
Это великолепно. Я не знал, что ты мог сделать это.
Finbarr

5

В качестве альтернативы расширению скобок вы можете использовать функции расширения истории оболочки 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?


2

Вы можете попробовать:

pushd .
cd /really/long/directory/name/
mv whatever.1 whatever.2
popd

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успешного изменения каталога.
гейра

-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.
zpletan
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.