web-dev-qa-db-fra.com

avec mv, considérez le chemin / nom du fichier d'origine lors du choix de la destination

Dites que je dois déplacer le fichier /etc/dir1/dir2/dir3/a.out vers /etc/dir1/dir2/dir3/b.out

Taper le chemin complet deux fois est fastidieux, et aller au répertoire peut ne pas être idéal. Existe-t-il un moyen de procéder de la sorte sans retaper le répertoire?

Sur une question connexe (que je soupçonne a la même solution). Dites que je veux déplacer un fichier someverybigfilename.png vers somereallybigfilename.png. Y a-t-il un moyen d'accomplir cela sans retaper le nom?

(Je sais que je peux utiliser un script. Mais mv supporte-t-il une telle chose de manière native?)

En bref: comment utiliser move pour modifier partiellement/modifier uniquement une partie d'un nom de fichier? Comment faire un petit changement comme une extension?

6
josinalvo

Dans le premier cas, si vous utilisez bash, vous pouvez utiliser développement d'accolade :

mv /etc/dir1/dir2/dir3/{a.out,b.out} 

ou même

mv /etc/dir1/dir2/dir3/{a,b}.out

Dans le second cas, vous pouvez utiliser à nouveau l’extension d’accolade:

mv some{very,really}bigfilename.png

Ou bien (bien que cela ne vous épargne pas vraiment beaucoup de frappe), vous pouvez utiliser Bash extension de l'historique comme suit:

$ mv someverybigfilename.png !#$:s/very/really
mv someverybigfilename.png somereallybigfilename.png
13
steeldriver

soit

cd /etc/dir1/dir2/dir3/
mv a.out b.out

ou

faire un script comme

#!/bin/bash
dir_Path="/etc/dir1/dir2/dir3/"

mv $dir_Path\a.out $dir_Path\b.out

exit

et renommer:

#!/bin/bash
dir_Path="/etc/dir1/dir2/dir3/"
name_part="bigfile.png"
cd $dir_Path
mv some$name_part somereally$name_part

exit
2
DarkPhoenix6

Si le chemin est le même, je ne vois pas la raison pour laquelle vous ne devez pas entrer dans le dossier.

Vous pouvez enregistrer le chemin avec pushd ou revenir avec cd -

Exemple:

luca@Elite:~$ pushd dir1/dir2/dir3/
~/tmp/dir1/dir2/dir3 ~/tmp
luca@Elite:~/dir1/dir2/dir3$ mv a.out b.out
luca@Elite:~/dir1/dir2/dir3$ popd
~/tmp
luca@Elite:~$ 

ou

luca@Elite:~$ cd dir1/dir2/dir3/
luca@Elite:~/dir1/dir2/dir3$ mv b.out a.out
luca@Elite:~/dir1/dir2/dir3$ cd -
luca@Elite:~$ 

À propos du nom de fichier, la seule chose qui me vienne à l’esprit est de le stocker dans une variable.

2
Luca Giovenzana

Il y a plusieurs façons d'aborder cela. On pourrait être via la fonction définie dans le fichier ~/.bashrc.

pmv(){
    mv "$1"/"$2" "$1"/"$3"
}

La fonction pmv prend alors 3 arguments. Chemin d'accès au répertoire, au fichier source et au fichier de destination. Par exemple:

$ ls testdir
self_test.sh*  test.wxg
$ pmv ./testdir  test.wxg  test2.wxg                                                                                     
$ ls testdir                                                                                                             
self_test.sh*  test2.wx

Notez que dans cette fonction, nous joignons chemin de répertoire et chemin de fichier avec une barre oblique. Ainsi, lorsque chemin vers répertoire est donné en argument de ligne de commande, il ne devrait pas y avoir de barre oblique finale à la fin. Nous pouvons cependant améliorer la définition de la fonction en utilisant expansion des paramètres de bash, ce qui nous permettra ensuite d’utiliser /path/to/dir ou /path/to/dir/:

pmv(){
    mv "${1%/}"/"$2" "${1%/}"/"$3"
}

Sur une question connexe (que je soupçonne a la même solution). Dites que je veux déplacer un fichier someverybigfilename.png vers somereallybigfilename.png. Y a-t-il un moyen d'accomplir cela sans retaper le nom?

Effectivement, non, il n’ya aucun moyen de faire cela avec mv seul. Même les solutions steeldriver et mine pour la première partie de votre question utilisent les fonctionnalités de bash, pas celles de mv. Des manipulations de renommage plus avancées, telles que dans votre cas, l'insertion de texte dans le nom de fichier, doivent être effectuées avec prename où vous utilisez des expressions régulières Perl pour renommer des fichiers de manière dynamique.

$ touch someverybigfilename.png

$ prename 's/very/really/' someverybigfilename.png                                                                       

$ ls somereallybigfilename.png                                                                                           
somereallybigfilename.png
1