Le moyen le plus rapide de renommer les fichiers, sans retaper le chemin du répertoire

56

Je sais comment renommer des fichiers sous Unix:

$ mv ~/folder/subfolder/file.txt ~/folder/subfolder/file.sh

     ^-------this part------^    ^------this part-------^

Il faut trop de temps pour répéter ~/folder/subfolder/filedeux fois.

Y a-t-il un moyen plus rapide?

Hamed Kamrava
la source

Réponses:

104

Si votre shell supporté Expansion Brace (fonctionne avec csh, tcsh, ksh, zsh, bash, mksh, lksh, pdksh, yashavec croisillon-expand activée en appelant yash --brace-expandou ensemble dans la coquille interative avec set -o brace-expand, ou fish):

mv ~/folder/subfolder/file.{txt,sh}
cuonglm
la source
4
le mieux est la simplicité!
Braiam
2
utilisation géniale de l'expansion en coquille brillante!
harish.venkat
3
Il est génial, mais vraiment cryptique. Cela fonctionne mais au premier abord, je pense que cela a un effet différent: déplace deux fichiers quelque part. Je ne pense pas que ce soit une bonne idée, d’autant plus qu’il existe une bien meilleure solution rename.
yo
4
@tohecz: Pourquoi est-ce cryptique? C'est une fonctionnalité de shell et tout le monde peut le savoir en lisant la page de manuel de shell. Et je ne pense pas que ce renamesoit une meilleure solution car renamene jamais vous demander de remplacer le fichier existant ou non.
jeudi
1
@ Gnouc tu es l'homme.
Débutant le
20

Vous pouvez également utiliser rename(une partie du paquet util-linux).

rename .txt .sh ~/folder/subfolder/file.txt

Voir la page de manuel renommer pour plus de détails.

jofel
la source
+1 C’est la meilleure façon de procéder, bien mieux que de compter sur la {a,b}fonctionnalité des shells .
yo
5
Dans certaines distributions Linux (telles que Ubuntu), il renames'agit d'un programme totalement différent, basé sur Perl. Là, vous utiliseriez rename 's/txt$/sh/' ~/folder/subfolder/file.txt.
evilsoup
Sur Debian (et Ubuntu), il y a aussi mmv.
ctrl-alt-delor
10

Tout ce qui précède est bon. Cela fonctionnerait aussi:

( cd ~/folder/subfolder && mv file.txt file.sh )
Bjorn
la source
Non, ça ne marche pas pour moi!
Hamed Kamrava
Cela fonctionnera si vous supprimez la sudopièce.
Cthulhu
1
@Cthulhu Oui, vous avez raison. Mais pourquoi ne travaille pas avec sudo?
Hamed Kamrava
2
@HamedKamrava Probablement parce que sudocela l'interprète ~comme le répertoire personnel de la racine.
Cthulhu
Vous pouvez sudole mv, mais pas cd. Découvrez pourquoi cd est un shell intégré. Et vous ne pouvez pas sudo(
utiliser
6

Non, vous devez donner le chemin complet au fichier pour le renommer. La seule alternative est de se déplacer dans le dossier cible avant d'exécuter le mv:

cd ~/folder/subfolder/
mv file.txt file.sh

Vous pouvez également écrire une petite fonction qui renomme le fichier dans le répertoire cible. Par exemple, ajoutez ces lignes à votre fichier d’initialisation du shell ( ~/.bashrcsi vous utilisez bash):

lmv(){
    _path=$(dirname -- "$1")
    _target="${_path%/}/$2"
    mv -- "$1" "$_target"
}

Ensuite, ouvrez un nouveau terminal ou lancez-vous simplement source ~/.bashrcpour relire le fichier init et vous pouvez faire:

lmv ~/folder/subfolder/file.txt file.sh
terdon
la source
+1 pour la lmv()fonction. Je ne savais pas que :)
Hamed Kamrava
1
@HamedKamrava personne ne le savait. Je viens de l'écrire, ce n'est pas quelque chose de standard.
terdon
2
Je connais. Je veux dire que je ne savais pas que je pouvais écrire ma propre fonction!
Hamed Kamrava
2

Juste pour étendre l'utilité de la réponse de Cuonglm (ne pas prendre de crédit car j'aime sa solution) et sa réponse est correcte.

Le cas d'utilisation est que nous voulons souvent mv un fichier dans un emplacement distant (le vrai problème), par exemple, /folder/subfolder/configFile.dat TO configFile.dat.orig

Cette forme de la commande ajoute une extension de fichier (ne remplace pas l'extension d'origine)

mv ~/folder/subfolder/file.txt{,.orig}

Expliqué: "{, .orig}" signifie remplacer (rien) à la fin du nom du fichier par (quelque chose) ".orig"

OU pour supprimer une extension de fichier (inverser le changement de nom)

mv ~/folder/subfolder/file.txt{.orig,}

Remarque: Toujours dans la rubrique "Le moyen le plus rapide de renommer des fichiers sans retaper le chemin du répertoire".

spikendu
la source
1

Oui. Si vous utilisez bash, vous faites sudo pushd ~/folder/subfolder/ && sudo mv ./file.txt ./file.sh && popd.

Ce qui est en réalité plus gros et peut échouer si vous perdez des autorisations d’accès au répertoire original lorsque vous avez effectué le popd.

41754
la source
1
Quel est le point d' pushdet popdici? Comment est-ce meilleur que cd ~/folder/subfolder/ && sudo mv file.txt file.sh?
terdon
1
Le fait est que vous êtes après la commande dans le dossier que vous avez démarré, et non dans aucun sous-dossier. Une alternative à pushd popdest d'utiliser cdet de revenir avec cd -.
Jofel
L’auteur de la question semblait indiquer son intention de ne pas modifier le répertoire de travail et popdest meilleur que cd ../../, le cas échéant.
41754
7
Utilisez (cd /path/to/there && mv x y)ensuite (avec un sous-shell)
Stéphane Chazelas
Vous ne devriez vraiment pas mettre sudoavant pushd. Donc, la commande complète devrait être pushd ...dir && sudo mv old new && popd. Au lieu de cela, on pourrait le faire, (cd ...dir; sudo mv old new)car une exécution dans un sous-shell se chargera automatiquement des changements de répertoire.
Mikko Rantalainen