Иногда я редактировал какой-то файл и хочу переместить его в другую папку. (Как правило: в папку Dropbox, где я не хотел работать, чтобы не давать другим владельцам папки постоянные обновления.) Я делаю это, например, с
mv file.pdf ../../../Dropbox/sharedfolder/subdirectory/file.pdf
После этого мне часто хочется поменять каталог на целевой каталог моей предыдущей операции перемещения. Я попадаю на стрелку вверх, удаляю финал file.pdf
, держу влево, удаляю mv file.pdf
и заменяю его на cd
.
Есть ли более быстрый и умный способ сделать это? Существует ли команда «переместить файл и затем изменить каталог на», или ярлык для последнего использованного каталога, или что-то в этом роде?
command-line
mv
Мис де Врис
источник
источник
Ответы:
Если вы используете bash, то его история взаимодействия имеет только ярлык для этого. Слово целеуказатель для последнего аргумента предыдущей команды:
В сочетании с модификатором для удаления последнего компонента имени пути:
После необязательного обозначения слова вы можете добавить последовательность из одного или нескольких допустимых модификаторов , каждому из которых предшествует «:».
Так:
Тот же ярлык можно использовать и с Zsh.
источник
Если вы не меняете имя файла, вы можете опустить его, и mv добавит его автоматически; это особенно полезно при перемещении нескольких файлов:
Используя каталог в качестве последнего аргумента, вы можете использовать
!!:$
или!$
как описывает ответ Муру.Если вы используете bash с обычными значениями по умолчанию, вы можете использовать Alt+ .вместо.
(Это команда readline
insert-last-argument
; отобразитbind -p
список всех ваших текущих привязок.)источник
mv
всегда перезаписывает файлы назначения без вывода сообщений, если вы не укажете параметры-i
/--interactive
или-n
/--no-clobber
. Вот почему у меняalias mv='mv -i' cp='cp -i'
в моем.bashrc
.Другой подход - создать собственную команду, предназначенную для этой цели. Это можно сделать с помощью функции, которая может выглядеть следующим образом:
Где: (1)
mv-special
- имя функции; (2) переменные$1
и$2
аргументы в функции, которые будут использоваться командамиmv
иcd
; (3)$(echo $2-)
добавляет символ wildcat в конец строки в var$2
и исправляет поведение,dirname
если переменная$2
содержит только путь; (4)$(dirname $(echo $2-))
будет фильтровать только путь от$2
.Согласно этому ответу функция может выглядеть так:
Где:
${2%/*}
будет фильтровать только путь от$2
.Чтобы быть доступной как команда, эта функция должна быть экспортирована :
Использование:
или:
Обратите внимание, что для обоих вариантов второй аргумент (
$2
) должен заканчиваться именем файла или косой чертой (/
).Чтобы наша новая команда была постоянно доступна, к ней должны быть добавлены определение функции и команда экспорта
~/.bashrc
:или:
Пользовательская команда может быть сделана и через исполняемый файл скрипта, который находится внутри
~/bin
или внутри/usr/sbin
: Как я могу создать пользовательскую команду терминала (для запуска скрипта)? Но, если честно, я столкнулся с проблемой поведенияcd
в этом сценарии.источник