J'ai des fichiers avec des caractères non valides comme ceux-ci
009_-_�%86ndringshåndtering.html
C'est un Æ
cas où quelque chose s'est mal passé dans le nom du fichier.
Est-il possible de supprimer tous les caractères non valides?
ou pourrait tr
être utilisé en quelque sorte?
echo "009_-_�%86ndringshåndtering.html" | tr ???
Réponses:
Une façon serait avec sed:
Remplacez
file
par votre nom de fichier, bien sûr. Ceci remplacera tout ce qui n'est pas une lettre, un chiffre, un point, un trait de soulignement ou un tiret avec un trait de soulignement. Vous pouvez ajouter ou supprimer des caractères pour les conserver à votre guise et / ou remplacer le caractère de remplacement par un autre élément ou rien du tout.la source
f='file'; mv 'file' ${f//[^A-Za-z0-9._-]/_}
Je suppose que vous êtes sur une machine Linux et que les fichiers ont été créés sur une machine Windows. Linux utilise UTF-8 comme codage de caractères pour les noms de fichiers, tandis que Windows utilise autre chose. Je pense que c'est la cause du problème.
Je voudrais utiliser "convmv". C'est un outil qui peut convertir les noms de fichiers d'un encodage de caractères en un autre. Pour l’Europe occidentale, l’un de ces programmes fonctionne normalement:
Si vous avez besoin de l’installer sur un Linux basé sur Debian, vous pouvez le faire en lançant:
Cela fonctionne pour moi à chaque fois et il récupère le nom de fichier d'origine.
Source: LeaseWebLabs
la source
Save the current file in Word 97-2004 format\sco.workflow
qui a été créé sur mon Mac (via Microsoft Office) et les encodages ci-dessus n'ont aucun effet.--notest
option de renommer les fichiers.Je suppose que vous voulez dire que vous voulez traverser le système de fichiers et réparer tous ces fichiers?
Voici comment je le ferais
Tous les fichiers contenant des caractères non ASCII seraient remplacés par des caractères de soulignement (
_
). Attention, si un fichier portant le nouveau nom existe déjà, il sera écrasé. Le script peut être modifié pour vérifier si tel est le cas, mais je ne l'ai pas intégré pour que cela reste simple.la source
Après les réponses sur https://stackoverflow.com/questions/2124010/grep-regex-to-match-non-ascii-characters , vous pouvez utiliser:
où
*
correspond aux fichiers que vous souhaitez renommer. Si vous voulez le faire sur plusieurs annuaires, vous pouvez faire quelque chose comme:Vous pouvez utiliser l'argument -n
rename
pour effectuer un essai, et voir ce qui serait changé, sans le changer.la source
Certains fichiers japonais contenant des noms de fichiers endommagés ont été récupérés à partir d’une clé USB endommagée et les solutions ci-dessus ne fonctionnent pas.
Je recommande le forfait de désintoxication:
Exemple d'utilisation:
la source
detox
avant de réinventer la roue. Si vous consultez la page de manuel, vous constaterez qu’elle couvre toutes les autres solutions proposées ici en raison de sa flexibilité.的节奏啊
, mais ces caractères sont un nom de fichier valide.Ce script shell assainit un répertoire de manière récursive pour rendre les fichiers portables entre Linux / Windows et FAT / NTFS / exFAT. Il supprime les caractères de contrôle
/:*?"<>\|
et certains noms Windows réservés tels queCOM0
.Linux est en théorie moins restrictif (
/
et\0
est strictement interdit dans les noms de fichiers), mais dans la pratique, plusieurs caractères interfèrent avec les commandes bash (comme*
...), ils doivent donc également être évités dans les noms de fichiers.Excellentes sources pour les restrictions de nommage des fichiers:
la source
Si vous souhaitez gérer les sauts de ligne, les caractères multi-octets, les espaces, les tirets, les barres obliques inverses et les espaces, vous aurez besoin de quelque chose de plus robuste, consultez la réponse suivante:
https://superuser.com/a/858671/365691
Je mets le script sur code.google.com si cela vous intéresse: rnf-bash-rename-script
la source
J'utilise ce one-liner pour supprimer les caractères non valides dans les fichiers de sous-titres:
Cela fonctionne pour normaliser les noms de répertoire des films:
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é en:
X-Men.Days.of.Future.Past.2014.1080p
la source
pour le fichier en *; do mv "$ file" $ (echo "$ file" | sed -e '/ [^ A-Za-z0-9. -] / / g'); terminé &
la source