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?
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
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
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.
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