9 votes

Comment supprimer les caractères spéciaux d'un nom de fichier ?

J'ai un fichier dont le nom est "Date du jour.txt".

Ce qui m'intéresse, c'est de supprimer tous les caractères spéciaux en utilisant le terminal, par exemple :

" - , ' ' [ 

La raison en est que je les insère dans un script plus tard et c'est un trop gros casse-tête de comptabiliser et de changer les noms individuellement.

Les espaces " " et les underscores "_" et l'alphabet "A-Z, a-z" sont acceptés, de même que le remplacement des caractères plutôt que leur effacement.

J'ai d'abord pensé que la commande "iconv" du terminal pourrait m'aider en convertissant vers un encodage plus simple, mais j'ai essayé plusieurs des encodages et il semble que je me sois trompé.

Je sais que les expressions régulières pourraient m'aider, mais malheureusement, je n'y connais pas grand-chose. J'ai trouvé ce Une question qui semble pertinente, mais je ne sais pas comment la mettre en œuvre ou si elle couvre les mêmes cas que les miens.

La raison pour laquelle j'ai posté cette question ici est qu'elle pourrait être propre au jeu de caractères qu'OSX prend en charge pour les noms de fichiers et à l'encodage qu'il utilise... bien qu'il soit plus probable que je n'ai aucune idée de ce dont je parle.

Merci d'avance pour votre aide.

Edit : La commande

sed 's/[!@#\$%^&*()]//g'

Il semble fonctionner très bien mais je n'arrive pas à le faire fonctionner pour mon cas d'utilisation original et d'autres :

' ` "

Leur échapper ne marche pas non plus. Je suis très novice en matière de scripting bash, alors soyez indulgent avec moi.


Edit 2 : Je le poste ici, sinon je devrais attendre 6 heures.

En plus de la réponse d'Alan Shutko, je voudrais ajouter ma propre solution que j'ai trouvée.

awk '{gsub(/[[:punct:]]/,"")}1'

J'hésite un peu à poster ceci car je ne peux pas bien l'expliquer.

Awk, comme l'indique sa page de manuel, est utilisé comme "langage d'analyse et de traitement orienté motif". La fonction gsub recherche et remplace toutes les occurrences de l'expression régulière que vous avez saisie. La partie gsub ressemblerait à ceci :

gsub("a","b")

Dans mon exemple, toutes les occurrences de a seraient remplacées par b. Comme dans le commentaire ci-dessus, [[:punct :]] semble correspondre à tous les signes de ponctuation. Cependant, je ne sais pas ce que représente le 1 à l'extérieur des parenthèses.

12voto

Ido Schacham Points 1373

Si vous avez un ensemble spécifique de personnages que vous voulez garder, tr fonctionne très bien.

Par exemple

tr -cd 'A-Za-z0-9_-'

Supprime tous les caractères qui ne font pas partie du jeu de caractères listés. (Le -d signifie supprimer, et le -c signifie le complément des caractères listés : en d'autres termes, tout caractère non listé est supprimé).

8voto

Cela ne remplacerait que les guillemets simples par des traits de soulignement :

for f in *; do mv "$f" "${f//'/_}"; done

Cela permet de ne conserver que les caractères alphanumériques ASCII, les traits de soulignement et les points :

for f in *; do mv "$f" "$(sed 's/[^0-9A-Za-z_.]/_/g' <<< "$f")"; done

Des localités comme en_US.UTF-8 utiliser l'ordre de collation ASCII sur OS X, mais [[:alnum:]] y \w correspondent également à des caractères comme ä en eux. Si LC_CTYPE est C les caractères à plusieurs octets sont remplacés par des caractères de soulignement multiples.

3voto

intagli Points 678

J'ai récemment eu le même problème et j'ai dû supprimer les caractères spéciaux des noms de tous les fichiers d'un dossier. J'ai utilisé cette commande, qui est une combinaison des deux réponses postées ici, mais qui conserve également les points. Peut-être que cela aidera quelqu'un.

for file in *; do echo mv "$file" `echo $file | tr -cd 'A-Za-z0-9_.-'` ; done

en retirant le echo devant mv "$file" exécute la commande.

0voto

J'utilise ce

for file in *; do echo mv \""$file"\" \"`echo $file | tr -cd 'A-Za-z0-9_-.[] '`\" ; done

En supprimant l'écho devant mv "$file", on exécute la commande.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X