12
votes

Capitaliser la première lettre de chaque mot dans un nom de fichier ou un répertoire dans Shell

J'essaie d'écrire une commande shell où je peux spécifier un répertoire, puis chaque fichier et répertoire à l'intérieur aura la première lettre de chaque mot capitalisé. Donc

/documents/test.txt

doit changer sur

/documents/test.txt

Je pense que cela devrait commencer comme xxx

Le problème que je ne puisse pas comprendre est de faire uniquement la première lettre. J'ai fait un script qui majuscule tout le nom du fichier, mais je ne peux pas comprendre comment obtenir la première lettre de chaque mot.

Merci!


2 commentaires

Il n'y a aucun moyen de limiter le contexte de tr , donc c'est définitivement la mauvaise commande ici. Il substitue toujours toutes les occurrences des caractères que vous fournissez comme arguments.


Cela pourrait aider: Theunixshell.blogspot.com/ 2013/02 / ...


5 Réponses :


6
votes

Utilisation de GNU SED

Vous pouvez le faire assez facilement avec GNU SED. Par exemple: xxx

limitations

Notez que l'évacuation de \ u est une extension GNU SED. Le manuel dit:

Enfin, comme une extension GNU 'SED', vous pouvez inclure une séquence spéciale constituée d'une barre oblique inverse et d'une des lettres 'L', 'L', 'U', 'U', ou 'E'. < / p> xxx


1 commentaires

Cela ne fait rien pour moi.



7
votes

Bash 4.0+ a une substitution de paramètres 'minuscule à majuscule'. Changer seulement Le premier caractère l'utilise comme ceci: xxx

le résultat: xxx


3 commentaires

Cela n'aide pas l'OPS à utiliser un cas de capitalisation après chaque composant de chemin. Si vous pouvez montrer comment faire l'expansion majuscule sur plusieurs parties des chemins de chemin à l'aide de Pure Bash, ce serait une bonne réponse, mais je ne pouvais pas trouver un moyen de faire ce produit sans passer de multiples passages sur la chaîne.


Vous pouvez faire une deuxième boucle interne avec ifs = / pour scinder les composants de la cheminée.


Changé après le commentaire de Tripleee.



5
votes
Target=`echo $Source | tr [A-Z] [a-z] | sed -e 's/^./\U&/g; s/ ./\U&/g'`
echo $Target

One Two Three Four

3 commentaires

Ne fonctionne que pour les personnages A-Z, et non pour les caractères internationaux.


Exactement ce que je cherchais!


@svante, regardez la décomposition / normalisation du personnage Unicode, ici et ici . Décomposez , recherchez ce code, utilisez ce code, puis Recombine . Ce n'est pas tout bash , bien que l'on puisse écrire une version bash .



2
votes

Évitez la boucle à l'aide des fonctionnalités de v4 : XXX PRE>

Vous pouvez l'intégrer dans une fonction de coquille: P>

$ capitalize_subdirs '/doCumenTS/tesT.txt'
/DoCumenTS/TesT.txt

$ capitalize_subdirs $'/d\noCu\tme nTS/tesT.txt'
/D
oCu     me nTS/TesT.txt


1 commentaires

Malheureusement, bash-seulement, pas même à Zsh: /



3
votes

Avant: xxx pré>

modification: p> xxx pré>

après: p>

$ find . -mindepth 1 -depth -print
./Foo/Baz/File4
./Foo/Baz
./Foo/File2
./Foo
./Bar/File3
./Bar
./File1


2 commentaires

La clé ici consiste ici à utiliser l'option -Depth Rechercher afin de vous assurer que les fichiers d'un répertoire sont renommés avant le répertoire lui-même.


trouver. -Mindepth 1 -Depth -execcdir bash -c 'f = $ {0 #. /}; mv - "$ f" "$ {f ^}" '{} \;