Як говорити в bash, як я можу перейменувати файл, не повторюючи шлях? [дублікат]


39

Можливий дублікат:
повторне використання тексту в команді bash

Якщо я хочу перейменувати файл у кілька каталогів глибоко, як я можу уникнути повторення шляху?

Наприклад:

mv path/to/old_filename.txt path/to/new_filename.txt

Мені цікаво, чи є спосіб зробити це:

mv path/to/old_filename.txt (?)new_filename.txt

Де (?)можна було б сказати "в одному каталозі".

Відповіді:


26

Використання розширення історії bash :

mv path/to/oldfile !#:1:h/newfile

де !#:1:hозначає: з рядка, який ви зараз набираєте ("! #"), візьміть перше слово (": 1"), а потім візьміть з нього лише компонент шляху (": h" - голова).


Це найближче до того, що початковий запитуючий припускав, що рішення може бути, і корисно знати, тому +1.
crazy2be

2
Класно! Я думаю, що метод розширення брекетів Дарта простіший, але це саме те, про що я попросив.
Натан Лонг

Я сьогодні навчився двох чудових нових речей. Крім того, я назавжди буду вважати розширення брекетів як "розширення брекетів Дарта", тому що це звучить приголомшливо.
PileOfMush

62

Ви можете використовувати розширення дужок: mv path/to/{old_filename.txt,new_filename.txt}

Ось посилання на посібник GNU про розширення дужок в оболонці bash, який визначає список замінників і повідомляє bash повторювати параметр, використовуючи інший замінник кожного разу, коли він повторюється.

Наприклад,

a{b,c,dd,e}

буде розширено до

ab ac add ae

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


5
Або тримати його до мінімуму: mv path/to/{old,new}_filename.txt. Це також допомагає перевернути чи інші види близького до повторення команди. Я багато разів це робив, наприклад mv /etc/X11/xorg.conf{,.backup}, маючи змогу змінити процес простою зміною mv /etc/X11/xorg.conf{.backup,}.
Даніель Андерссон

26

Відповідь Дарта вище розумна, але якщо ви хочете скористатися підходом cd, ви можете також розглянути можливість використання додаткової оболонки:

(cd path/to && mv old_filename.txt new_filename.txt)

Оскільки зміна каталогів відбувається в підпакеті, ви фактично не будете змінювати каталоги у своїй інтерактивній оболонці.


1
Суттєвий недолік: Ви не можете використовувати доповнення вкладки для old_filename.txt.
bluenote10

9

Ще одна альтернатива, яка корисна, якщо ви збираєтеся виконати кілька команд у каталозі, така:

pushd /path/to
mv oldfile newfile
...
popd

5

Мені подобається відповідь @ Дарта . Ось альтернатива:cd path/to && mv oldfile newfile && cd -


1
Зверніть увагу, якщо mvне вдасться (наприклад, немає дозволів), ви залишитеся в path/toкаталозі. Ви можете спробувати cd path/to && mv oldfile newfile ; cd -переконатися, що cd -він завжди працює, за винятком випадків, коли cd path/to(без дозволів) не виходить, ви все одно будете виконувати cd -та переходити до попереднього каталогу, який є небажаним. mlc (+1) відповідь на нижчу суму краще. Я думаю, що cd . && cd path/to && mv oldfile newfile ; cd -це працювало б 99,9% часу ( cd .лише в разі невдачі, якщо ви або ваші поточні дозволи редактора змінилися; і в такому випадку перехід до іншого режиму не такий вже й поганий з результатом.
Д-р Джимбоб
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.