Зміна каталогу на ціль операції переміщення


12

Інколи я редагував якийсь файл і хочу перенести його в іншу папку. (Зазвичай: у папку Dropbox, де я не хотів працювати, щоб уникнути постійного оновлення інших власників папки.) Я роблю це, наприклад, за допомогою

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

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

Чи є швидший, розумніший спосіб зробити це? Чи є команда "перемістити файл, а потім змінити каталог на", або ярлик для останнього використовуваного каталогу, чи щось подібне?


1
якщо ви тримаєте CTRL + вліво, вона піде лівіше за словом, яке швидше
кішка

Бічний коментар, а не відповідь на ваше запитання про оболонку: я зазвичай просто призупиняю 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+ ..
(Це insert-last-argumentкоманда readline ; bind -pперелічить усі ваші поточні прив'язки.)


1
зауважте, що, опустивши ім'я файлу призначення, можна мовчки замінити файл призначення, якщо він уже існує
кіт

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.