fichiers cp ou mv dans le même répertoire où ils sont déjà quand je suis dans un autre?

12

Si je suis en ligne ~/blobet que j'ai un fichier en~/blob/a_long_directory_name/c/x.x

je peux taper

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

Existe-t-il un raccourci permettant de taper quelque chose de plus court qui utilise le chemin du répertoire dans le premier paramètre (mais pas mon répertoire actuel), par exemple

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

où quelque chose comme $same_dirpointerait vers le dir de param 1

Michael Durrant
la source

Réponses:

8

Pour minimiser la quantité de frappe, il est probablement plus facile de le faire en deux étapes. CD dans le répertoire, puis déplacez.

Si vous n'avez qu'une seule commande, vous pouvez utiliser un sous-shell:

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

Cela signifie cdque le prendra effet uniquement dans le sous-shell, le mvse produira uniquement si le cdréussit, et le répertoire de travail de votre shell actuel ne changera pas.

Si vous avez plusieurs commandes, utilisez la pile de répertoires.

$ pushd blob/a_long_directory_name/c/
$ mv x.x y.y
$ mv z.z q.q
$ popd
Alan Shutko
la source
Cela ne règle pas le even_morechemin relatif ...
Inutile
C'est exact. L'exemple $ same_dir semble également l'ignorer.
Alan Shutko
+1 J'aime ça. Très facile à retenir et à faire et c'est la clé pour moi
Michael Durrant
Intéressant, car il ne fait pas ce que vous avez demandé. Peut-être que votre question n'est pas exactement ce que vous vouliez?
inutile
Inutile, j'ai mis à jour mon titre pour préciser qu'il s'agit de fichiers cp / mv et les conserver dans ce même répertoire, même si je suis dans un autre. btw votre nom d'utilisateur est mignon mais cela rend les commentaires ridicules lorsqu'ils sont utilisés en eux :)
Michael Durrant
26

Avec bash, vous pouvez utiliser l' expansion d'accolade

mv blob/a_long_directory_name/{c/x.x,evenmore/y.y}
iruvar
la source
5

Vous pouvez utiliser les capacités de substitution de texte de votre shell. Dans bash, vous pouvez utiliser une bête comme:

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

Pour le décomposer:

!# est la ligne actuelle tapée jusqu'à présent

:$demande de choisir le dernier mot (remplacer par un chiffre npour choisir nle mot) de la chaîne considérée ( !#dans ce cas). Le dernier mot de la ligne tapée jusqu'à présent serait le mot précédent.

:gs^xx^yyfait une gsubstitution textuelle globale ( ) ssur le mot résultant, en remplaçant 'xx' par 'yy'. ^n'est qu'un délimiteur pour la scommande permettant d'utiliser /dans vos modèles.

Cette méthode est légèrement plus générale car elle vous permet de remplacer n'importe quelle partie du chemin ('xx') par n'importe quel autre mot ('yy').

Enfin, comme pour toute manipulation d'historique, il est bon d'avoir les options de shell appropriées définies (par exemple dans ~/.bashrc). Dans ce cas

shopt -s histverify

affichera la ligne modifiée une fois que vous aurez appuyé sur Retour, vous pourrez donc la modifier et vérifier les erreurs.

Pourquoi vous utiliseriez une construction comme ça, je ne suis pas sûr, mais cela fonctionne dans ce cas.

Wojtek
la source
a) Trop de bruit de ligne (par rapport à une élégante extension d'accolade) b) Ne résout pas le problème de l'OP: ils veulent remplacer c/x.xen evenmore/y.ygardant le préfixe de chemin d'origine.
Joseph R.
Votre deuxième commentaire était une simple omission de ma part, qui nécessitait une simple modification pour corriger. Je ne vois pas comment cette réponse méritait un downvote. Avec l'édition (technicité), cela résout le problème et est plus général car il permet d'échanger n'importe quelle partie du chemin (j'ai souvent utilisé quelque chose de similaire $PWD). Bien sûr, ce n'est peut-être pas le plus élégant, mais cela indique que le shell a des substitutions textuelles et des désignateurs de mots, que certains utilisateurs pourraient toujours trouver utiles pour la recherche.
Wojtek
D'ACCORD. Je me suis trompé.
Joseph R.