Изменить каталог на цель операции перемещения


12

Иногда я редактировал какой-то файл и хочу переместить его в другую папку. (Как правило: в папку Dropbox, где я не хотел работать, чтобы не давать другим владельцам папки постоянные обновления.) Я делаю это, например, с

mv file.pdf ../../../Dropbox/sharedfolder/subdirectory/file.pdf

После этого мне часто хочется поменять каталог на целевой каталог моей предыдущей операции перемещения. Я попадаю на стрелку вверх, удаляю финал file.pdf, держу влево, удаляю mv file.pdfи заменяю его на cd.

Есть ли более быстрый и умный способ сделать это? Существует ли команда «переместить файл и затем изменить каталог на», или ярлык для последнего использованного каталога, или что-то в этом роде?


1
если вы удерживаете CTRL + Left, он будет идти влево на слово, которое быстрее
— кошка

Дополнительный комментарий, а не ответ на ваш вопрос оболочки: я обычно просто приостанавливаю Dropbox во время редактирования. Это также гарантирует, что никакие другие файлы не будут изменены "под моими ногами".
— Константино Царухас

Ответы:


17

Если вы используете bash, то его история взаимодействия имеет только ярлык для этого. Слово целеуказатель для последнего аргумента предыдущей команды:

!!:$
обозначает последний аргумент предыдущей команды. Это может быть сокращено до !$.

В сочетании с модификатором для удаления последнего компонента имени пути:

После необязательного обозначения слова вы можете добавить последовательность из одного или нескольких допустимых модификаторов , каждому из которых предшествует «:».

h
Удалите конечный компонент имени пути, оставив только заголовок.

Так:

$ echo /ab/c/d
/ab/c/d
$ echo !$:h
echo /ab/c
/ab/c

Тот же ярлык можно использовать и с Zsh.


1
Это так круто.
— Старейшина Гик

4

Если вы не меняете имя файла, вы можете опустить его, и mv добавит его автоматически; это особенно полезно при перемещении нескольких файлов:

mv file.pdf ../../../Dropbox/sharedfolder/subdirectory/

mv *.pdf ../../../Dropbox/sharedfolder/subdirectory/

Используя каталог в качестве последнего аргумента, вы можете использовать !!:$или !$как описывает ответ Муру.
Если вы используете bash с обычными значениями по умолчанию, вы можете использовать Alt+ .вместо.
(Это команда readline insert-last-argument; отобразит bind -pсписок всех ваших текущих привязок.)


1
обратите внимание, что если пропустить имя файла назначения, то можно молча перезаписать файл назначения, если он уже существует
— cat

mvвсегда перезаписывает файлы назначения без вывода сообщений, если вы не укажете параметры -i/ --interactiveили -n/ --no-clobber. Вот почему у меня alias mv='mv -i' cp='cp -i'в моем .bashrc.
— Дэвид Фёрстер

-1

Другой подход - создать собственную команду, предназначенную для этой цели. Это можно сделать с помощью функции, которая может выглядеть следующим образом:

$ function mv-special { mv $1 $2; cd $(dirname $(echo $2-)); }

Где: (1) mv-special - имя функции; (2) переменные $1и $2аргументы в функции, которые будут использоваться командами mvи cd; (3) $(echo $2-) добавляет символ wildcat в конец строки в 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в этом сценарии.

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