88 votes

Comment supprimer les caractères invalides des noms de fichiers ?

J'ai des fichiers avec des caractères invalides comme ceux-ci

009_-_%86ndringshåndtering.html

Il s'agit d'un Æ où quelque chose s'est mal passé dans le nom du fichier.

Existe-t-il un moyen de supprimer tous les caractères non valides ?

ou pourrait tr être utilisé d'une manière ou d'une autre ?

echo "009_-_%86ndringshåndtering.html" | tr ???

7voto

KrisWebDev Points 233

Ce Shell Shell aseptise un répertoire récursivement, pour rendre les fichiers portables entre Linux/Windows et FAT/NTFS/exFAT. Il supprime les caractères de contrôle, /:*?"<>\| et certains noms réservés à Windows comme COM0 .

sanitize() {
  shopt -s extglob;

  filename=$(basename "$1")
  directory=$(dirname "$1")

  filename_clean=$(echo "$filename" | sed -e 's/[\\/:\*\?"<>\|\x01-\x1F\x7F]//g' -e 's/^\(nul\|prn\|con\|lpt[0-9]\|com[0-9]\|aux\)\(\.\|$\)//i' -e 's/^\.*$//' -e 's/^$/NONAME/')

  if (test "$filename" != "$filename_clean")
  then
    mv -v "$1" "$directory/$filename_clean"
  fi
}

export -f sanitize

sanitize_dir() {
  find "$1" -depth -exec bash -c 'sanitize "$0"' {} \;
}

sanitize_dir '/path/to/somewhere'

Linux est moins restrictif en théorie ( / y \0 sont strictement interdits dans les noms de fichiers) mais en pratique, plusieurs caractères interfèrent avec les commandes bash (comme * ...), il faut donc les éviter dans les noms de fichiers.

D'excellentes sources pour les restrictions de noms de fichiers :

3voto

Christopher Points 653

J'utilise cette ligne unique pour supprimer les caractères invalides dans les fichiers de sous-titres :

for f in *.srt; do nf=$(echo "$f" |sed -e 's/[^A-Za-z0-9.-]/./g;s/\.\.\././g;s/\.\././g'); test "$f" != "$nf" && mv "$f" "$nf" && echo "$nf"; done
  1. Traite uniquement les fichiers *.srt( * pourrait être utilisé à la place de *.srt pour traiter tous les fichiers)
  2. Supprime tous les autres caractères, à l'exception des lettres A-Za-z, des chiffres 0-9, des points "." et des tirets "-".
  3. Supprime les éventuels points doubles ou triples
  4. Vérifie si le nom du fichier doit être modifié.
  5. Si c'est le cas, il renomme le fichier à l'aide de la commande mv, puis affiche les modifications apportées à l'aide de la commande echo.

Il permet de normaliser les noms de répertoire des films :

for f in */; do nf=$(echo "$f" |sed -e 's/[^A-Za-z0-9.]/./g' -e 's/\.\.\././g' -e 's/\.\././g' -e 's/\.*$//'); test "$f" != "$nf" && mv "$f" "$nf" && echo "$nf"; done

Mêmes étapes que ci-dessus mais j'ai ajouté une commande sed supplémentaire pour supprimer un point à la fin du répertoire

X-Men Days of Future Past (2014) [1080p]
Modifié pour :
X-Men.Days.of.Future.Past.2014.1080p

1voto

Adam D. Points 119

Si vous voulez gérer les nouvelles lignes intégrées, les caractères multi-octets, les espaces, les tirets de tête, les barres obliques inversées et les espaces, vous aurez besoin de quelque chose de plus robuste, voir cette réponse :
https://superuser.com/a/858671/365691

J'ai mis le script sur code.google.com si quelqu'un est intéressé : r-n-f-bash-renommer-script

1voto

BoeroBoy Points 156

Je sais que c'est un peu vieux mais récemment j'ai découvert que le translate-Shell de Google est vraiment utile pour les fichiers étrangers avec des noms qui provoquent unicode. Renommage par lot utile avec traduction dans Shell.

$ echo   | trans -b
download

https://github.com/soimort/translate-Shell

[MISE À JOUR] L'API de Google Translate a tendance à vous bloquer si vous appuyez trop souvent dessus, mais j'ai également trouvé une option locale pratique qui convertit entre les alphabets, appelée uconv. Elle est utile sur le plan phonétique mais pas pour la traduction :

echo  | uconv -x 'Any-Latin;Latin-ASCII'
skacat'

-3voto

Jairo Bernal Points 1

For file in * ; do mv "$file" $(echo "$file" | sed -e 's/[^A-Za-z0-9. -]/ /g') ; done &

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X