Иногда, я отредактировал некоторый файл и хочу переместить его в другую папку. (Обычно: к папке Dropbox, где я не хотел работать, чтобы не давать другим владельцам папки постоянные обновления.) Я делаю это, например, с
mv file.pdf ../../../Dropbox/sharedfolder/subdirectory/file.pdf
Впоследствии, я часто желаю для изменения каталога на целевой каталог моей предыдущей операции пересылки. Я поражаю стрелку вверх, удаляя финал file.pdf
, оставленное содержание, удаление mv file.pdf
и замена его с cd
.
Существует ли более быстрый, более умный способ сделать это? Существует ли "файл перемещения, и затем измените каталог для" управления, или ярлык для последнего используемого каталога или чего-то как этот?
Если вы используете bash, то его история взаимодействия имеет только ярлык для этого. слово-указатель для последнего аргумента предыдущей команды:
blockquote>
!!:$
обозначает последний аргумент предыдущей команды. Это может быть сокращено до!$
.В сочетании с модификатором для удаления последнего компонента имени пути:
После необязательного обозначения слова вы можете добавить последовательность из одного или нескольких из допустимые модификаторы , каждому из которых предшествует ':'.
blockquote>
h
Удалите завершающий компонент имени пути, оставив только заголовок.Итак:
$ echo /ab/c/d /ab/c/d $ echo !$:h echo /ab/c /ab/c
Этот же ярлык можно использовать и с zsh.
Если Вы не изменяете имя файла, можно опустить его, и mv добавит его автоматически; это особенно полезно при перемещении нескольких файлов:
mv file.pdf ../../../Dropbox/sharedfolder/subdirectory/
mv *.pdf ../../../Dropbox/sharedfolder/subdirectory/
С каталогом как последний аргумент, можно использовать !!:$
или !$
, как ответ muru описывает.
при использовании удара с обычными значениями по умолчанию можно использовать Высокий звук + . вместо этого.
(Это - команда readline insert-last-argument
; bind -p
перечислит всю Вашу текущую привязку.)
Другой подход должен создать Вашу собственную команду, выделенную с этой целью. Это может быть сделано через функцию, которая могла быть похожей:
$ function mv-special { mv $1 $2; cd $(dirname $(echo $2-)); }
Где: (1) mv-special
имя функции; (2) переменные $1
и $2
аргументы в функции, кто будет использоваться командами mv
и cd
; (3) $(echo $2-)
добавляет рискованный символ в конец строки в var $2
, и фиксирует поведение dirname
если переменная $2
содержит только путь; (4) $(dirname $(echo $2-))
отфильтрует только путь от $2
.
Согласно этому ответу функция могла быть похожей:
$ function mv-special { mv $1 $2; cd ${2%/*}; }
Где: ${2%/*}
отфильтрует только путь от $2
.
Чтобы быть доступной как команда, эта функция должна быть экспортирована:
$ export -f mv-special
Использование:
$ mv-special file.pdf ../../../Dropbox/sharedfolder/subdirectory/file.pdf
или:
$ mv-special file.pdf ../../../Dropbox/sharedfolder/subdirectory/
Обратите внимание на тот - для обоих вариантов - второй аргумент ($2
) должны концы с именем файла или наклонной чертой (/
).
Чтобы быть нашей новой постоянно доступной командой, определение функции и команды экспорта должно быть добавлено к ~/.bashrc
:
# My custom 'mv-special' command:
function mv-special { mv $1 $2; cd $(dirname $(echo $2-)); }
export -f mv-special
или:
# My custom 'mv-special' command:
function mv-special { mv $1 $2; cd ${2%/*}; }
export -f mv-special
Пользовательская команда может быть сделана и через исполняемый файл сценария, который помещается в ~/bin
или в /usr/sbin
: Как я могу создать пользовательскую терминальную команду (для запущения скрипта)? Но честно говоря, со мной стояли проблема с поведением cd
в этом сценарии.