Renommer des fichiers par lots dans le dossier

10

Comment puis-je supprimer du texte des noms de fichiers dans un dossier?

J'essaie actuellement:

rename s/"NEWER_(.*?)"//g *

Mais rien n'est renommé

J'ai un dossier parent, avec un tas de sous-dossiers, dans lesquels se trouvent des fichiers, que OneDrive a pensé être une excellente idée d'ajouter un "(NEWER_timestamp)" à, et j'aimerais le supprimer.

Exemples de noms de fichiers:

getyou.ico (NEWER_1417529079.87)
o7pm.ico (NEWER_1417529184.89)
o7th.ico (NEWER_1417529135.81)
Kevin
la source
2
Pouvez-vous publier un exemple de nom de fichier?
muru
sûr. question mise à jour avec certains
Kevin

Réponses:

8

Essayez ce qui suit:

find /path/to/parrent-dir -type f -exec rename -n 's:[^/]*(.*) .*$:$1:' {} +

./o7th.ico (NEWER_1417529135.81)                                 renamed as /o7th.ico
./sub-dir (NEWER_1417529135.81)/getyou.ico (NEWER_1417529079.87) renamed as /sub-dir (NEWER_1417529135.81)/getyou.ico
./sub-dir (NEWER_1417529135.81)/o7pm.ico (NEWER_1417529184.89)   renamed as /sub-dir (NEWER_1417529135.81)/o7pm.ico
./getyou.ico (NEWER_1417529079.87)                               renamed as /getyou.ico
./o7pm.ico (NEWER_1417529184.89)                                 renamed as /o7pm.ico
  • Tout [^/]*(.*) .*$ne correspond qu'à la dernière partie du chemin d'accès qui ne contient pas de /. Et
  • Dans l'expression rationnelle ci-dessus, (.*)est un groupe de tout correspondre après la dernière /et avant un espace . Sa référence arrière sera $1.
  • .*$fait correspondre tout à la fin $du nom des fichiers après l'espace.
  • Enfin, dans la partie de remplacement de renommer s/.../REPLACEMENT/, nous venons de conserver le groupe correspondant qui est entre le dernier \et un espace (.*)qui est connu comme groupe de correspondances.
αғsнιη
la source
2

Vous devriez envisager d'utiliser les guillemets en dehors de l'expression régulière (à l'intérieur, ils sont pris littéralement comme des guillemets) et échapper (. Essayer;

rename -n 's/ \(NEWER_\d{10}.\d{2}\)$//' *NEWER*

La précision de l'expression n'est peut-être pas nécessaire, mais vous ne devez pas être trop prudent lorsque vous modifiez des fichiers.

muru
la source
tout ce que cela fait est suspendu avec reading filenames from STDINJe suis déjà dans le dossier Parent où tous ces fichiers sont
Kevin
@Kevin "Si aucun nom de fichier n'est donné sur la ligne de commande, les noms de fichier seront lus via l'entrée standard." Et puisque le shell reste *NEWER*tel qu'il est si aucune extension n'est trouvée, vous devez avoir fait une erreur, ou utilisez un shell qui a remplacé un caractère générique inégalé par rien.
muru
copié et collé dans le shell Ubuntu 14.10
Kevin