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

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список всех ваших текущих привязок.)

deltab
источник
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в этом сценарии.

pa4080
источник