Supprimer les préfixes des noms de fichiers

10

J'ai un tas de fichiers comme suit:

04602635_b0294.DAT20120807164534
04602637_b0297.DAT20120807164713
04602638_b0296.DAT20120807164637
04602639_b0299.DAT20120807164819
04602640_b0298.DAT20120807164748
04602641_b0300.DAT20120807164849
04602650_b0301.DAT20120807164921
04602652_b0302.DAT20120807164956

Je dois les renommer pour exclure le préfixe. Il faut que ça ressemble à ça ..

b0294.DAT20120807164534
b0297.DAT20120807164713
b0296.DAT20120807164637
b0299.DAT20120807164819
b0298.DAT20120807164748
b0300.DAT20120807164849
b0301.DAT20120807164921
b0302.DAT20120807164956

ÉDITER

J'ai oublié d'ajouter que j'utilise Solaris.

Pieter van Niekerk
la source

Réponses:

19
for file in * ; do
    echo mv -v "$file" "${file#*_}"
done

exécutez ceci pour vous assurer que tout va bien.
si c'est le cas, supprimez echode la commande et il renommera les fichiers comme vous le souhaitez.

"${file#*_}"

est une fonction de substitution habituelle dans le shell. Il supprime tous les caractères avant le premier _symbole (y compris le symbole lui-même). Pour plus de détails, regardez ici .

se ruer
la source
Pourriez-vous expliquer ce qui se passe exactement "${file#*_}"?
Pieter van Niekerk
J'ai ajouté une explication à ma réponse.
rush
IMO, la plupart de tous les scripts doivent être écrits pour faire écho à la sortie de commande souhaitée. Mais ne supprimez pas ensuite le echo, dirigez simplement la sortie du script vers bash.
Jim L.
7

Vous pouvez utiliser l'outil renamepour cela:

rename "s/.*_//" *

Si vous l'ajoutez, -nil ne renommera rien et vous montrera simplement ce qui aurait été fait sans -n.

En réponse au commentaire de rush: my renameis est en fait un lien vers prenamelivré avec le perlpaquet Debian et Ubuntu .

scai
la source
5
Notez que ce renamen'est pas toujours le même sur différents systèmes et que parfois sa syntaxe peut différer.
rush
1
Le demandeur a maintenant ajouté qu'il utilise Solaris. Donc cette commande de renommage (qui est spécifique à Debian et aux dérivés) n'est pas disponible pour lui.
Gilles 'SO- arrête d'être méchant'
1
... sauf s'il parvient à le construire à partir de la source.
sendmoreinfo
@Gilles perl-renamen'est pas du tout spécifique à Debian. Il n'est simplement pas appelé renamemais perl-renameou prenamedans d'autres distributions. Il devrait toujours être dans le référentiel et un est également installé avec perl .
terdon
@terdon Une commande pour renommer des fichiers dont l'utilisation de base est une expression perl n'est pas spécifique à Debian. Une telle commande, appelée renameet susceptible d'être installée sans demander explicitement un paquet qui n'est pas appelé justerename , est spécifique à Debian. D'autres distributions Linux appellent la commande prenameou perl-renamepour éviter toute confusion avec l'util-linux renameet ne le regroupent pas avec le paquet perl, et je ne connais aucun unix non Linux qui le livre sous le nom renameou qui le livre dans un installation par défaut sous n'importe quel nom.
Gilles 'SO- arrête d'être méchant'