Supprimer “!”, ” des noms de fichiers

J’essaie de renommer plus de 1700 vidéos pour un émulateur que je rassemble,

Certains des fichiers peuvent ressembler aux exemples suivants:

romfilename1!!! (Japan) [SLUS-01005].mp4 romfilename2 (USA) [SLUS-28605] (Disc 1).mp4 romfilename3 (USA) [SLUS-28605] (Disc 2).mp4 

J’essaie d’atteindre les résultats suivants:

 romfilename1.mp4 romfilename2 (Disc 1).mp4 romfilename3 (Disc 2).mp4 

Jusqu’à présent, j’ai pu supprimer (USA) et (Japon) en utilisant:

 for i in *.mp4 do mv "$i" "`echo $i | sed 's/ (USA)//'`" done 

Alors maintenant, je suis coincé sur la façon dont je pourrais supprimer les marques d’exclamation, j’ai passé beaucoup de temps à chercher une réponse, mais je n’ai pas eu beaucoup de chance. Je suis également bloqué sur la façon dont j’ai éliminé ces choses “[SLUS-28605]” Principalement à cause des parenthèses “[” et “]”, le code à l’intérieur n’est pas important. J’ai suivi les instructions suivantes, mais ces caractères particuliers gâchent les choses.

 for i in *.mp4 do mv "$i" "`echo $i | sed 's/!!//'`" done 

et…

 for i in *.mp4 do mv "$i" "`echo $i | sed 's/[SLUS-28605]//'`" done 

et..

 for i in *.mp4 do mv "$i" "`echo $i | sed -i 's/[]"[]//g' done 

Merci d’avance pour toute assistance, Nem

Vous n’avez pas besoin de sed pour cela.

 shopt -s extglob for i in *.mp4 do # Remove all !; the ! doesn't need to be escaped if history # expansion is disabled. new_i=${i//\!} # Remove the *first* parenthesized group (which contains the country) new_i=${new_i/ (+([!)]))} # Remove the bracketed group new_i=${new_i// \[*]} #mv "$i" "$new_i" echo "mv \"$i\" \"$new_i\"" done 

Vous pouvez supprimer l’ echo une fois que vous avez vérifié que les commandes mv sont correctes.

Vous pouvez substituer plusieurs motifs sur une seule ligne en utilisant sed et échapper aux caractères spéciaux tels que les espaces et les accolades:

 #!/bin/bash for i in *.mp4 do mv "$i" "$(echo $i | sed 's/!!!//; s/\ (USA)\ //; s/\ (Japan)\ //; s/\[SLUS-[^][]*\]//')" done 

Vous pouvez utiliser la commande rename pour cela. Il supporte les regexes. Donc, la commande va ressembler à:

 rename 's/[![]]//g' * 

ou

 rename 's/[!]*\|\[[^]]*\]\| *(Japan) *\| *(USA) *//g' * 

Bien, s’il vous plaît vérifier la page de manuel de rename disponible dans votre système. Par exemple, les dissortingbutions basées sur deb et basées sur rpm utilisent des versions différentes et regex variera en fonction de votre version de renommage locale.

Regex devrait être ajusté à votre exigence complète, car il n’est pas vraiment clair de la question.

Il sauvera également des problèmes possibles avec des symboles spéciaux dans le nom de fichier comme \n et autres.

Retirer le ! :

 for i in *.mp4 do name=`echo $i | sed 's/!//g'` mv "$i" "$name" done 

Enlevez le [???]:

 for i in *.mp4 do name=`echo $i | sed 's/\[[^][]*\]//g'` mv "$i" "$name" done 

Retirer le (???) :

 for i in *.mp4 do name=`echo $i | sed 's/([^)(]*)//g'` mv "$i" "$name" done 

Si vous souhaitez supprimer tout en une fois:

 for i in *.mp4 do name=`echo $i | sed 's/!//g' | sed 's/([^)(]*)//g' | sed 's/\[[^][]*\]//g' ` mv "$i" "$name" done