cp або mv файли в той самий каталог, в якому вони вже є, коли я перебуваю в іншому?


12

Якщо я перебуваю ~/blobі маю файл у~/blob/a_long_directory_name/c/x.x

Я можу набрати

mv blob/a_long_directory_name/c/x.x blob/a_long_directory_name/even_more/y.y

Чи є ярлик, за допомогою якого я можу ввести щось коротше, що використовує шлях до каталогу в першому параметрі (не мій поточний каталог), наприклад

mv blob/a_long_directory_name/c/x.x $same_dir/y.y

де щось подібне $same_dirвказувало б на парам 1

Відповіді:


8

Щоб мінімізувати кількість набору тексту, можливо, найпростіше це зробити в два етапи. CD в ​​каталог, потім перемістіть.

Якщо у вас є лише одна команда, ви можете використовувати підзаголовок:

$ (cd blob/a_long_directory_name/c/ && mv x.x y.y )

Це означає, що cdволя почне діяти лише в передпласті, це mvвідбудеться лише в тому випадку, якщо це cdвдасться, і робочий каталог вашої поточної оболонки не зміниться.

Якщо у вас є кілька команд, використовуйте стек каталогів.

$ pushd blob/a_long_directory_name/c/
$ mv x.x y.y
$ mv z.z q.q
$ popd

Це не стосується even_moreвідносного шляху ...
Марно

Це правильно. Приклад $ same_dir, здається, також ігнорує його.
Алан Шутко

+1 Мені це подобається. Дуже легко запам’ятати і зробити, і це для мене
ключово

Цікаво, адже він не робить того, про що ви просили. Можливо, ваше запитання не зовсім те, що ви задумали?
Марно

Марно, я оновив свою назву, щоб уточнити, що йдеться про файли cp / mv і зберігати їх у тому самому каталозі, хоча я перебуваю в іншому. btw ваше ім'я користувача мило, але це робить коментарі виглядати нерозумно, коли використовується в них :)
Michael Durrant


5

Ви можете використовувати можливості заміни тексту оболонки. В bash, ви можете використовувати звіра, як:

mv blob/a_long_directory_name/c/xx !#:$:gs^c/xx^evenmore/yy

Щоб розбити його:

!# - поточний рядок, набраний поки що

:$просить вибрати останнє слово (замінити числом, nщоб вибрати n'-е слово) рядка, що розглядається ( !#у цьому випадку). Останнє слово рядка, набраного поки що, було б попереднім словом.

:gs^xx^yyробить глобальну ( g) текстову заміну ( s) на отриманому слові, замінюючи "xx" на "yy". ^це лише роздільник для sкоманди, яка дозволяє використовувати /у ваших шаблонах.

Цей метод дещо більш загальний, оскільки дозволяє замінити будь-яку частину шляху ('xx') будь-яким іншим словом ('yy').

Нарешті, як і при будь-якій маніпуляції з історією, добре встановити відповідні параметри оболонки (наприклад, в ~/.bashrc). В цьому випадку

shopt -s histverify

з'явиться відредагований рядок після натискання клавіші return, тож ви все ще можете редагувати його та перевіряти на помилки.

Чому б ви використовували таку конструкцію, я не впевнений, але в цьому випадку вона працює.


а) Занадто багато шуму лінії ( по порівнянні з елегантним розширенням розпірки) б) не вирішує проблеми в OP ще: вони хочуть замінити c/x.xз evenmore/y.yзбереженням вихідного префікса шляху.
Джозеф Р.

Ваш другий коментар був простим упущенням з мого боку, який вимагав простого редагування для виправлення. Я не бачу, наскільки ця відповідь заслужила перемоги. За допомогою редагування (технічності) це вирішує проблему і є більш загальним, оскільки дозволяє міняти будь-яку частину шляху (я часто використовував щось подібне $PWD). Звичайно, можливо, це не найелегантніше, але це вказує на той факт, що в оболонці є текстові підстановки та позначення слів, які деякі користувачі все ж можуть вважати корисними для дослідження.
Войтек

ГАРАЗД. Я стою виправлений.
Джозеф Р.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.