Changer le répertoire en cible de l'opération de déplacement

12

Parfois, j'ai édité un fichier et je souhaite le déplacer vers un autre dossier. (Généralement: dans un dossier Dropbox, où je ne voulais pas travailler pour éviter de donner aux autres propriétaires du dossier des mises à jour constantes.) Je le fais, par exemple, avec

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

Par la suite, je me retrouve souvent à vouloir changer de répertoire vers le répertoire cible de ma précédente opération de déplacement. Je me retrouve à frapper la flèche vers le haut, à supprimer la finale file.pdf, à tenir à gauche, à la supprimer mv file.pdfet à la remplacer par cd.

Existe-t-il un moyen plus rapide et plus intelligent de le faire? Existe-t-il une commande "déplacer le fichier puis changer de répertoire en", ou un raccourci pour le dernier répertoire utilisé, ou quelque chose comme ça?

Mees de Vries
la source
1
si vous maintenez CTRL + Gauche, il ira à gauche par mot, ce qui est plus rapide
cat
Commentaire secondaire, pas une réponse à votre question shell: je suspends généralement Dropbox pendant la modification. Il garantit également qu'aucun autre fichier ne sera modifié "sous mes pieds".
Constantino Tsarouhas

Réponses:

17

Si vous utilisez bash, son interaction avec l'historique n'a que le raccourci pour cela. Le mot désignateur du dernier argument de la commande précédente:

!!:$
désigne le dernier argument de la commande précédente. Cela peut être raccourci !$.

Combiné avec un modificateur pour supprimer le dernier composant de chemin:

Après l'indicateur de mot facultatif, vous pouvez ajouter une séquence d'un ou plusieurs des modificateurs valides , chacun précédé d'un «:».

h
Supprimez un composant de chemin de fin, ne laissant que la tête.

Donc:

$ echo /ab/c/d
/ab/c/d
$ echo !$:h
echo /ab/c
/ab/c

Le même raccourci peut également être utilisé avec zsh.

muru
la source
1
C'est trop cool.
Elder Geek
4

Si vous ne changez pas le nom de fichier, vous pouvez l'omettre et mv l'ajoutera automatiquement; ceci est particulièrement utile lors du déplacement de plusieurs fichiers:

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

mv *.pdf ../../../Dropbox/sharedfolder/subdirectory/

Avec le répertoire comme dernier argument, vous pouvez utiliser !!:$ou !$comme la réponse de muru le décrit.
Si vous utilisez bash avec les valeurs par défaut habituelles, vous pouvez utiliser Alt+ à la .place.
(Il s'agit de la insert-last-argumentcommande readline ; bind -prépertoriera toutes vos liaisons actuelles.)

deltab
la source
1
notez que l'omission du nom du fichier de destination peut écraser silencieusement le fichier de destination s'il existe déjà
cat
mvécrase toujours les fichiers de destination en silence, sauf si vous spécifiez les options -i/ --interactiveou -n/ --no-clobber. Voilà pourquoi je l'ai alias mv='mv -i' cp='cp -i'dans mon .bashrc.
David Foerster
-1

Une autre approche consiste à créer votre propre commande dédiée à cet effet. Cela peut être fait via une fonction qui pourrait ressembler à ceci :

$ function mv-special { mv $1 $2; cd $(dirname $(echo $2-)); }

Où: (1) mv-special est le nom de la fonction; (2) les variables $1et $2sont des arguments dans la fonction qui seront utilisés par les commandes mvet cd; (3) $(echo $2-) ajoute un caractère générique à la fin de la chaîne dans var $2et corrige le comportement de dirnamesi la variable $2ne contient que le chemin; (4) $(dirname $(echo $2-)) filtrera uniquement le chemin depuis $2.

Selon cette réponse, la fonction pourrait ressembler à:

$ function mv-special { mv $1 $2; cd ${2%/*}; }

Où: ${2%/*}filtrera uniquement le chemin depuis $2.

Pour être disponible en tant que commande, cette fonction doit être exportée :

$ export -f mv-special

Usage:

$ mv-special file.pdf ../../../Dropbox/sharedfolder/subdirectory/file.pdf

ou:

$ mv-special file.pdf ../../../Dropbox/sharedfolder/subdirectory/

Veuillez faire attention à cela - pour les deux variantes - le deuxième argument ( $2) doit se terminer par filename ou slash ( /).

Pour être notre nouvelle commande disponible en permanence, la définition de la fonction et la commande d'exportation doivent être ajoutées à ~/.bashrc:

# My custom 'mv-special' command:
function mv-special { mv $1 $2; cd $(dirname $(echo $2-)); }
export -f mv-special

ou:

# My custom 'mv-special' command:
function mv-special { mv $1 $2; cd ${2%/*}; }
export -f mv-special

entrez la description de l'image ici


Une commande personnalisée peut être effectuée et via un fichier de script exécutable qui est placé dans ~/binou dans /usr/sbin: Comment puis-je créer une commande de terminal personnalisée (pour exécuter un script)? Mais pour être honnête, j'ai eu un problème avec le comportement de cddans ce scénario.

pa4080
la source