web-dev-qa-db-fra.com

Batch Rename Files in Folder

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

J'essaye actuellement:

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

Mais rien ne se renomme

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

Exemple de noms de fichiers:

getyou.ico (NEWER_1417529079.87)
o7pm.ico (NEWER_1417529184.89)
o7th.ico (NEWER_1417529135.81)
10
Kevin

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 qui ne contient pas de /. Et
  • Dans la regex ci-dessus, (.*) est un groupe de tout correspondant après le dernier / et avant un espace. Sa référence arrière sera $1.
  • .*$ fait correspondre tout le contenu à end$ du nom de fichier après l'espace.
  • Enfin, dans la partie de remplacement du renom s/.../REPLACEMENT/, nous avons simplement conservé le groupe correspondant qui se situe entre le dernier \ et un espace(.*), appelé groupe de correspondances.
8
αғsнιη

Vous devriez envisager d'utiliser les guillemets en dehors de la regex (à l'intérieur, ils sont pris littéralement comme des guillemets) et d'é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 pouvez pas être trop prudent lorsque vous modifiez des fichiers.

2
muru