Renommer des fichiers avec une seule ligne de commande

10

J'ai ce répertoire et je veux renommer les fichiers:

===> ls -1 Der-vierte-Weise/
10 - 10 - Erkenntniss.ogg
1 - 01 - Hoffnung.ogg
11 - 11 - Wahrheit.ogg
12 - 12 - Dankbarkeit.ogg
13 - 13 - Kredits.ogg
2 - 02 - Familie.ogg
3 - 03 - Demut.ogg
4 - 04 - Freude.ogg
5 - 05 - Schoenheit.ogg
6 - 06 - Solidaritaet.ogg
7 - 07 - Entscheidung.ogg
8 - 08 - Hilfe.ogg
9 - 09 - Unterstuetzung.ogg

Le résultat devrait ressembler à ceci:

===> ls -1 Der-vierte-Weise/
01 - Hoffnung.ogg
02 - Familie.ogg
...

Je voudrais résoudre ce problème avec des outils shell courants.

guettli
la source
1
Je voudrais résoudre ce problème avec des outils shell courants. Je ne dis pas que vous n'avez pas de bonne raison, mais j'espère que vous vous êtes posé et répondu à une question "pourquoi?". La dernière fois que j'ai eu un problème très similaire à résoudre, j'ai immédiatement mis Bash de côté et l'ai résolu en Python. C'est beaucoup plus facile (mais je connaissais déjà Python, les méthodes de chaîne, glob.glob et os.rename - et j'ai aussi dû recursifier un arbre plein de noms de dossiers avec des espaces et d'autres caractères maladroits, dont aucun n'est une cause de plus dérange si vous utilisez Python)
nigel222
1
@ nigel222 Je suis paresseux et je veux taper le moins de caractères possible. C'est pourquoi je ne veux pas utiliser python ici. Ne vous méprenez pas. Jusqu'à présent, Python est mon langage de programmation préféré et je l'utilise quotidiennement.
guettli

Réponses:

18

Vous pourriez utiliser rename...

rename -n 's/^[0-9]+ - //' *

Supprimer -naprès le test pour renommer réellement les fichiers

Explication

  • s/old/new/remplacer oldparnew
  • ^ début de chaîne
  • [0-9]+ quelques chiffres
Zanna
la source
quel type de fleur regex est pris en charge par l' renameoutil. Utilise-t-il PCRE? ... serait génial.
guettli
5
@guettli à proprement parler, non ce n'est pas PCRE (c'est des expressions régulières compatibles Perl ). Le renameest un script Perl, il prend donc en charge les expressions régulières Perl; PCRE n'est qu'un sous-ensemble de cela. Cependant, tout ce que vous savez de PCRE sera applicable rename.
terdon
@terdon Je me fiche de l'implémentation. Si vous le regardez avec des lunettes mathématiques, il renamea des expressions régulières compatibles perl. Oui, l'implémentation pcre n'est pas utilisée. J'ai compris cela :-) Merci pour votre réponse rapide.
guettli
9

bash expansion des paramètres pour éliminer la portion requise dès le début:

for f in *[[:blank:]]*.ogg; do echo mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"; done

Forme développée:

for f in *[[:blank:]]*.ogg; do 
    echo mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"
done

echoest pour le fonctionnement à sec; se débarrasser de lui pour une action réelle:

for f in *[[:blank:]]*.ogg; do mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"; done

Exemple:

% ls -1
1 - 01 - Hoffnung.ogg
2 - 02 - Familie.ogg

% for f in *[[:blank:]]*.ogg; do mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"; done 

% ls -1                                                                             
01 - Hoffnung.ogg
02 - Familie.ogg
heemayl
la source
Oui, ça marche. Je vous remercie. Comme je connais l'expression régulière compatible perl de Python (que j'utilise quotidiennement), je préfère la renamecommande. (Moins de frappe nécessaire).
guettli
1
@guettli renameest la voie à suivre si vous connaissez PCRE; la renameréponse a déjà été donnée alors il faut bouger avec pure bash. Juste pour noter, pythonle module de re(ou regex) n'est pas entièrement compatible BTW PCRE.
heemayl
@guettli Vous venez également de rétrograder ma réponse? : O
heemayl
Oui, je l'ai fait, et j'ai voté pour votre commentaire. J'espère que vous ne le prenez pas personnellement. Ne vous méprenez pas, mais mon opinion personnelle est que ${f#[[:digit:]]*-[[:blank:]]}c'est moche. Oui cela fonctionne. Mais nous vivons au 21e siècle. Je pense qu'il est temps de passer de "ça marche" à "c'est facile et amusant". Si "ça marche" est le but, alors Linux ne perdra jamais le préjugé de ne pas être convivial. Puisque vous avez déjà obtenu beaucoup de votes positifs, ce vote négatif ne devrait pas faire de mal (j'espère). Si c'est le cas, dites-le-moi et je le reprendrai.
guettli
1
@guettli Tout ce qui vous convient. Ici: gnu.org/software/bash/manual/html_node/… Juste pour noter, la classe de caractère [[:digit:]]et [[:blank:]]étaient là pour se conformer à votre locale, ce sont assez communs dans Regex aussi.
heemayl