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бы указывало на 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, и храню их в том же каталоге, хотя я нахожусь в другом. Кстати, ваше имя пользователя симпатичное, но комментарии в нем выглядят глупо :)
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

После нажатия кнопки возврата отобразится отредактированная строка, поэтому вы все еще можете ее отредактировать и проверить на наличие ошибок.

Почему вы используете такую ​​конструкцию, я не уверен, но в этом случае она работает.

Войтек
источник
a) Слишком сильный линейный шум (сравните с элегантным расширением фигурных скобок) b) Не решает проблему OP: они хотят заменить c/x.xс evenmore/y.yсохранением исходного префикса пути.
Джозеф Р.
Ваш второй комментарий был простым упущением с моей стороны, которое требовало простого редактирования, чтобы исправить. Я не понимаю, как этот ответ заслуживает отрицательного ответа. С редактированием (техническая специфика) это решает проблему и носит более общий характер, поскольку позволяет менять любую часть пути (я часто использовал что-то похожее $PWD). Конечно, возможно, это не самое элегантное, но это указывает на тот факт, что в оболочке есть текстовые замены и обозначения слов, которые некоторые пользователи все еще могут найти полезными для исследования.
Войтек
OK. Я стою исправлено.
Джозеф Р.