Modifier plusieurs noms de fichiers en remplaçant un caractère

29

J'ai plusieurs fichiers nommés comme that : screenshot 13:25.png
Windows ont du mal à ouvrir ces fichiers probablement à cause du ":".

Comment puis-je le remplacer?

user236152
la source
2
Pouvez-vous peut-être accepter une réponse pour marquer la question comme résolue? Cela aidera grandement les autres utilisateurs.
MERose

Réponses:

52

Dans un terminal, cddans le bon répertoire, puis exécutez-le.

rename 's/\:/-/g' *.png -vn

Cela prévisualisera le changement de nom. Il devrait remplacer :par -.

Si cela semble correct, supprimez le nde la fin, puis il fera le changement de nom réel.

Remarque : les versions d'Ubuntu supérieures à 17.04 ne sont pas livrées avec rename, mais elles sont toujours disponibles dans les référentiels par défaut, donc utilisez-les sudo apt install renamepour l'obtenir

Oli
la source
Merci pour votre réponse. J'ai essayé et j'ai ce problème: motif de substitution non terminé à (eval 1) ligne 1.
user236152
@ user236152 Désolé, je suis devenu un peu fou avec les contre-obliques qui s'échappaient (était sur le pilote automatique!). Supprimé un couple et il devrait être valide maintenant.
Oli
Peut-être qu'un simple script Nautilus qui remplace tous ces caractères qui pourrait causer des problèmes sur d'autres plates-formes (exécuté sur tous les fichiers sélectionnés) pourrait être utile pour les personnes "multiplateformes".
Sadi
2
Pourquoi l'utiliser? Il vous montre ce qu'il fait (facilite la marche arrière si vous faites une erreur). Pourquoi à la fin? Juste pour pouvoir le retirer (ou le n) facilement.
Oli
1
@nightcrawler Vous devriez pouvoir enchaîner des remplacements complètement séparés:rename 's/\:/-/g; s/%28/ /g; s/%29//g' ...
Oli
10

Voici une solution bash pure:

for i in *:*; do
    mv "$i" "${i//:/_}"
done

Le ${var//pattern/replacement}format remplacera toutes les occurrences de patternavec replacementdans la variable $var. Pour plus d'informations sur les capacités de maipulation de chaînes de bash, voir ici .

Si vous voulez faire cela pour plusieurs personnages, vous pouvez simplement les placer dans une classe de personnages. Ainsi, par exemple, de remplacer tous ;, :, =, +, %, ,avec des underscores, vous pouvez le faire:

$ ls 
1foo:bar  2foo:bar:baz  3foo;bar  4foo=bar  5foo%bar  6foo,bar  7foo+bar
$ for i in *; do mv "$i" "${i//[:;=%,+]/_}"; done
$ ls
1foo_bar  2foo_bar_baz  3foo_bar  4foo_bar  5foo_bar  6foo_bar  7foo_bar

Fondamentalement, l'idée est que cela [ ]signifie any of the characters listed. Ainsi, en plaçant tous les personnages que vous souhaitez remplacer dans la classe de personnages, tous sont traités en même temps.


Pour les caractères spécifiques que vous avez demandés, les choses sont un peu plus complexes car certains d'entre eux doivent être échappés (j'ignore le /puisque * nix ne le permet pas dans les noms de fichiers plus que Windows ne le fait donc ce ne sera pas un problème):

$ ls
1foo<bar  2foo>bar  3foo:bar  4foo\bar  5foo|bar  6foo*bar  7foo?bar  8foo"bar  9foo'bar
$ for i in *; do mv "$i" "${i//[<>:\\|*\'\"?]/_}"; done
$ ls
1foo_bar  2foo_bar  3foo_bar  4foo_bar  5foo_bar  6foo_bar  7foo_bar  8foo_bar  9foo_bar

Notez que j'ai échappé au \, 'et "en ajoutant un \devant chacun.

terdon
la source
Peut-il être amélioré pour remplacer plusieurs caractères individuels (par exemple tous ceux qui ne sont pas acceptés par Windows) par d'autres?
Sadi
1
@Sadi voir la réponse mise à jour.
terdon
Fondamentalement, il y en a neuf: "<>:" / \ | ? * "
Sadi
@Sadi voir la réponse mise à jour.
terdon
Merci, cela pourrait aider à créer un script Nautilus qui rend les noms des fichiers sélectionnés compatibles avec Windows.
Sadi
2

Si vous préférez une interface graphique, installez pyrenamer:

sudo apt-get install pyrenamer

Exécutez-le ensuite:

pyrenamer

Il a des dizaines d'options pour les modèles et les formats de renommage.

animaletdesequia
la source
1

Je préfère l' interface graphique mais en tant qu'extension Nautilus, c'est -à- dire Nautilus Actions Extra :

sudo add-apt-repository ppa:nae-team/ppa
sudo apt-get update
sudo apt-get install nautilus-actions-extra
nautilus -q

(Voir www.webupd8.org/2011/12/nautilus-actions-extra-pack-of-useful.html )

Ensuite, lorsque vous sélectionnez les fichiers à renommer et cliquez sur Renommer dans le menu contextuel, de nombreuses options vous sont proposées pour renommer les fichiers.

Sadi
la source
0

Le renameutilspackage a un programme pratique appelé qmvqui fournit un changement de nom interactif par lots. Vous l'exécutez sur un répertoire ou une liste de fichiers, et il génère un fichier texte temporaire contenant leurs noms de fichier et démarre votre éditeur préféré. Lorsque vous quittez l'éditeur, tous les noms de fichiers que vous avez modifiés sont renommés en conséquence. qmvtransforme un problème de renommage par lots en un problème d'édition de texte.

Dans ce cas, vous pouvez utiliser qmv -f do *:*pour modifier les noms de tous les fichiers contenant deux points, puis la :%s/:/_/gcommande dans Vim (ou une recherche et remplacement correspondante dans l'éditeur que vous utilisez).

L' -f dooption définit le format du fichier texte pour avoir le nom de fichier de destination uniquement, ce qui rend la recherche et le remplacement plus simple. Le format par défaut comporte deux copies du nom de fichier sur chaque ligne et vous ne modifiez que le second. Cela lui permet de faire la bonne chose si vous avez supprimé ou réorganisé des lignes dans le fichier, mais ce n'est pas toujours le plus simple. Il existe également d'autres formats.

Avec qmv, vous pouvez choisir de diriger le fichier généré via une commande de votre choix, par exemple sed, si vous ne voulez pas la fonctionnalité interactive.

Dan Hulme
la source
0

Et voici un script Nautilus qui remplace (tous?) Les caractères incompatibles avec Windows par un trait d'union dans tous les noms de fichiers sélectionnés (basé sur la réponse de terdon ;-)

#!/bin/bash
filesall=""
while [ $# -gt 0 ]
    do
        files=`echo "$1" | sed 's/ /\?/g'`
        filesall="$files $filesall"
        shift
    done
for i in $filesall; do mv "$i" "${i//[<>:\\|*\'\"?]/-}"; done
Sadi
la source
0

Thunar (le gestionnaire de fichiers XFCE) a une fonctionnalité intégrée intéressante pour renommer en vrac les fichiers. Il a des options pour supprimer / remplacer les caractères, rechercher et remplacer, numéroter les fichiers et plus encore.

Installez thunar:

sudo apt-get install thunar

Ouvrez thunar, accédez à vos fichiers, sélectionnez-les et choisissez «renommer» (via le menu contextuel ou F2)

user154126
la source
0
@echo off
echo.
echo. How many Characters Do You Want To Remove
echo.
echo. From The End Of The FileName ?
echo.
echo.
set /p variable=" > "
setlocal enabledelayedexpansion
for /f "delims=" %%a in (' dir /b /a-d *.mp3') do (
set oldName=%%a
Set newName=!oldName:~0,-%variable%!.mp3
Ren "!oldName!" "!newName!"
)
exit
TekWiz2010
la source
Cela fonctionne bien et a une invite variable ... Nommez le fichier quelque chose comme _ Tronquer les derniers caractères.cmd
TekWiz2010
3
Bien que cela puisse être correct, il utilise un langage de script batch Windows. Nous sommes sur AskUbuntu, un site pour des questions liées à Ubuntu, et donc des outils liés à Ubuntu. À mon avis, cette réponse n'est peut-être pas nécessairement appropriée ici.
Sergiy Kolodyazhnyy
Vous auriez besoin de l'exécuter via Wine, mais il est probablement possible de l'exécuter sur Ubuntu ... C'est juste une réponse bizarre, c'est tout.
Oli