Je dois renommer une arborescence de dossiers complète de manière récursive afin qu'aucune lettre majuscule n'apparaisse nulle part (c'est du code source C ++, mais cela ne devrait pas avoir d'importance).
Points bonus pour ignorer les fichiers / dossiers de contrôle de version CVS et Subversion. La méthode préférée serait un script shell, car un shell devrait être disponible sur n'importe quelle machine Linux.
Il y avait des arguments valables sur les détails du changement de nom de fichier.
Je pense que les fichiers avec les mêmes noms en minuscules devraient être écrasés; c'est le problème de l'utilisateur. Lorsqu'il est extrait sur un système de fichiers ignorant la casse, il écrase également le premier par ce dernier.
Je considérerais les caractères AZ et les transformerais en az, tout le reste n'appelle que des problèmes (au moins avec le code source).
Le script serait nécessaire pour exécuter une compilation sur un système Linux, donc je pense que les modifications apportées aux fichiers de contrôle de version CVS ou Subversion devraient être omises. Après tout, il ne s'agit que d'un paiement à zéro. Peut-être qu'une «exportation» est plus appropriée.
ABCdef
,abcDEF
etaBcDeF
? Le script de changement de nom doit-il abandonner ou simplement avertir et continuer? 2. Comment définissez-vous des minuscules pour les noms non US-ASCII? Si de tels noms peuvent être présents, doit-on d'abord vérifier et exclure le passage? 3. Si vous exécutez une opération de changement de nomRéponses:
Une version concise utilisant la
"rename"
commande:Cela évite les problèmes avec les répertoires renommés avant les fichiers et en essayant de déplacer des fichiers dans des répertoires non existants (par exemple
"A/A"
vers"a/a"
).Ou, une version plus détaillée sans utiliser
"rename"
.PS
Ce dernier permet plus de flexibilité avec la commande de déplacement (par exemple,
"svn mv"
).la source
then
ligne -enclosed par(mv "${SRC}" "${DST}.renametmp" && mv "${DST}.renametmp" "${DST}") || echo "${SRC} was not renamed"
.find my_root_dir -depth -exec rename -c {} \;
. Ajoutez -f pour renommer si vous êtes sur un système de fichiers insensible à la casse (par exemple, Mac)-T
de lamv
commande.Plus petit encore j'aime bien:
Sur les systèmes de fichiers insensibles à la casse tels que HFS + d' OS X , vous voudrez ajouter l'
-f
indicateur:la source
The renaming utility that comes by default with Ubuntu is a Perl program sometimes called prename
perl-rename
(et est fourni par un package du même nom)la source
find
.find .
semble résoudre ce problème.for f in `find .`; do mv -v "$f" "`echo $f | tr '[A-Z]' '[a-z]'`"; done
Essayez simplement ce qui suit si vous n'avez pas besoin de vous soucier de l'efficacité.
la source
-0
(que de la zéro 'de, pas de compression) commutateurzip -0 -r foo.zip foo/
.-0
compression, était presque instantané!Mec, vous aimez trop compliquer les choses ... Utilisez:
la source
rename 'y/a-z/A-Z/' /tmp/*.jpg
->Can't rename /tmp/*.jpg /TMP/*.JPG: No such file or directory
, c'est-à-dire, essayez de renommer le chemin complet au lieu de seulement le fichier.La plupart des réponses ci-dessus sont dangereuses, car elles ne traitent pas de noms contenant des caractères impairs. Votre pari le plus sûr pour ce genre de chose est d'utiliser
find
l'-print0
option de, qui terminera les noms de fichiers avec ASCII NUL au lieu de \ n.Voici un script, qui ne modifie que les fichiers et non les noms de répertoires pour ne pas confondre
find
:Je l'ai testé, et cela fonctionne avec des noms de fichiers contenant des espaces, toutes sortes de guillemets, etc. Ceci est important car si vous exécutez, en tant que root, l'un de ces autres scripts sur une arborescence qui inclut le fichier créé par
... bien devinez quoi ...
la source
rename
au lieu demv
.Cela fonctionne si vous avez déjà configuré ou configuré la commande de changement de nom (par exemple via l' installation de brew sous Mac):
la source
brew install rename
--lower-case
? Ce n'est malheureusement pas le cas dans Arch Linux du moins.rename
n'est pas un bash intégré. Il s'agit d'un utilitaire externe et la syntaxe variera en fonction de la version que vous avez installée. Cette réponse n'est pas suffisante en tant que solution portable "pour tous les OS basés sur unix" comme le prétend.rename
commande incluse dans le dernier Fedora (28), viautil-linux-2.31
package, n'a pas l'--lower-case
option.Cela fonctionne sur CentOS / Red Hat Linux ou d'autres distributions sans le
rename
script Perl:Source: Renommez tous les noms de fichiers de majuscules à minuscules
(Dans certaines distributions, la
rename
commande par défaut provient de util-linux, et c'est un outil différent et incompatible.)la source
L'approche la plus simple que j'ai trouvée sur Mac OS X était d'utiliser le package de renommage de http://plasmasturm.org/code/rename/ :
la source
Voici ma solution sous-optimale, en utilisant un script shell Bash:
Les dossiers sont tous renommés correctement et
mv
ne posent pas de questions lorsque les autorisations ne correspondent pas, et les dossiers CVS ne sont pas renommés (les fichiers de contrôle CVS à l'intérieur de ce dossier sont toujours renommés, malheureusement).Puisque "find -depth" et "find | sort -r" renvoient tous deux la liste des dossiers dans un ordre utilisable pour le renommer, j'ai préféré utiliser "-depth" pour rechercher des dossiers.
la source
La question d'origine demandait d'ignorer les répertoires SVN et CVS, ce qui peut être fait en ajoutant -prune à la commande find. Par exemple pour ignorer CVS:
[modifier] J'ai essayé cela, et intégrer la traduction en minuscules dans la recherche n'a pas fonctionné pour des raisons que je ne comprends pas vraiment. Alors, modifiez ceci pour:
Ian
la source
Utilisation du fixateur de nom de fichier de Larry Wall:
C'est aussi simple que
(où
fix
est bien sûr le script ci-dessus)la source
Ceci est un petit script shell qui fait ce que vous avez demandé:
Notez l'action -depth dans la première recherche.
la source
Pas portable, Zsh seulement, mais assez concis.
Tout d'abord, assurez-vous qu'il
zmv
est chargé.Assurez
extendedglob
- vous également qu'il est activé:Puis utilisez:
Pour récursivement des fichiers et des répertoires en minuscules dont le nom n'est pas CVS .
la source
find -depth
imprime chaque fichier et répertoire, avec le contenu d'un répertoire imprimé avant le répertoire lui-même.${f,,}
minuscule le nom du fichier.la source
-depth
corrige ça! C'est une solution vraiment rapide, mais bien sûr, sans utiliser l'-print0
option de recherche, ce n'est pas la plus fiableAvec MacOS,
Installez le
rename
package,Utilisation,
Cette commande trouve tous les fichiers avec une
*.py
extension et convertit les noms de fichiers en minuscules.Par exemple,
la source
-I
optionxargs
ici?- I
drapeau n'est pas obligatoire. Il est utilisé lorsque nous exécutons plusieurs commandes avecxargs
. Voici un exemple d'utilisation de plusieurs commandes avecxargs
cat foo.txt | xargs -I % sh -c 'echo %; mkdir %'
You can run without-I
likefind . -iname "*.py" -type f | xargs -I% rename -c -f "%"
Utilisez le type :
Sous Windows, les émulations, comme Git Bash , peuvent échouer car Windows n'est pas sensible à la casse sous le capot. Pour ceux-ci, ajoutez d'abord une étape qui
mv
est le fichier à un autre nom, comme "$ old.tmp", puis à$new
.la source
Long mais "fonctionne sans surprise ni installation"
Ce script gère les noms de fichiers avec des espaces, des guillemets, d'autres caractères inhabituels et Unicode, fonctionne sur les systèmes de fichiers insensibles à la casse et la plupart des environnements Unix-y sur lesquels bash et awk sont installés (c'est-à-dire presque tous). Il signale également les collisions le cas échéant (en laissant le nom de fichier en majuscules) et renomme bien sûr les fichiers et les répertoires et fonctionne de manière récursive. Enfin, il est hautement adaptable: vous pouvez modifier la commande find pour cibler les fichiers / répertoires que vous souhaitez et vous pouvez modifier awk pour faire d'autres manipulations de nom. Notez que par "gère Unicode" je veux dire qu'il va effectivement convertir leur cas (ne pas les ignorer comme les réponses qui l'utilisent
tr
).Références
Mon script est basé sur ces excellentes réponses:
/unix/9496/looping-through-files-with-spaces-in-the-names
Comment convertir une chaîne en minuscules dans Bash?
la source
Cela fonctionne aussi bien sur macOS:
la source
J'avais besoin de le faire sur une configuration Cygwin sur Windows 7 et j'ai trouvé que j'avais des erreurs de syntaxe avec les suggestions ci-dessus que j'ai essayées (même si j'ai peut-être manqué une option de travail). Cependant, cette solution directement à partir des forums Ubuntu a fonctionné hors de la boîte :-)
(NB: j'avais précédemment remplacé les espaces par des traits de soulignement en utilisant:
)
la source
Sous OS X,
mv -f
affiche l'erreur «même fichier», donc je renomme deux fois:la source
Je voudrais utiliser Python dans cette situation, pour éviter de supposer de manière optimiste des chemins sans espaces ni barres obliques. J'ai également constaté que cela a
python2
tendance à être installé dans plus d'endroits querename
.la source
Si vous utilisez Arch Linux , vous pouvez installer
rename
) package à partir deAUR
qui fournit larenamexm
commande en tant/usr/bin/renamexm
qu'exécutable et une page de manuel avec elle.C'est un outil vraiment puissant pour renommer rapidement des fichiers et des répertoires.
Convertir en minuscules
Convertir en cas supérieur
Autres options
Vous pouvez récupérer l'exemple de fichier Developers.mp3 à partir d' ici , si nécessaire;)
la source
brew
de macOS est-l
lié à la création d'un lien symbolique et-c
à la conversion en minuscules, alors faites attention.Renommez d'abord les répertoires de bas en haut sort -r (où -depth n'est pas disponible), puis les fichiers. Ensuite, grep -v / CVS au lieu de find ...- élague parce que c'est plus simple. Pour les grands répertoires, for f in ... peut déborder de certains tampons du shell. Utilisez find ... | tout en lisant pour éviter cela.
Et oui, cela écrasera les fichiers qui ne diffèrent que dans le cas où ...
la source
find YOURDIR -type d | sort -r
c'est trop de problèmes. Tu veuxfind YOURDIR -depth -type d
. Deuxièmement, lefind -type f
DOIT s'exécuter après que les répertoires ont été renommés.Je n'ai pas essayé les scripts plus élaborés mentionnés ici, mais aucune des versions de ligne de commande n'a fonctionné pour moi sur mon Synology NAS.
rename
n'est pas disponible, et de nombreuses variantesfind
échouent car il semble s'en tenir à l'ancien nom du chemin déjà renommé (par exemple, s'il trouve./FOO
suivi de./FOO/BAR
, renommer./FOO
en./foo
continuera à être répertorié./FOO/BAR
même si ce chemin n'est plus valide) . La commande ci-dessus a fonctionné pour moi sans aucun problème.Ce qui suit est une explication de chaque partie de la commande:
Cela trouvera n'importe quel fichier du répertoire courant (changez
.
pour le répertoire que vous voulez traiter), en utilisant une recherche en profondeur d'abord (par exemple, il listera./foo/bar
avant./foo
), mais seulement pour les fichiers qui contiennent un caractère majuscule. Le-name
filtre s'applique uniquement au nom du fichier de base, pas au chemin complet. Donc, cela listera./FOO/BAR
mais pas./FOO/bar
. C'est correct, car nous ne voulons pas renommer./FOO/bar
. Nous voulons cependant renommer./FOO
, mais celui-ci est répertorié plus tard (c'est pourquoi il-depth
est important).Cette commande en elle-même est particulièrement utile pour trouver les fichiers que vous souhaitez renommer en premier lieu. Utilisez-le après la commande de changement de nom complète pour rechercher des fichiers qui n'ont toujours pas été remplacés en raison de collisions de noms de fichiers ou d'erreurs.
Cette partie lit les fichiers produits par
find
et les formate dans unemv
commande à l'aide d'une expression régulière. L'-n
option arrêtesed
d'imprimer l'entrée et lap
commande de l'expression régulière de recherche et de remplacement génère le texte remplacé.Le regex lui-même se compose de deux captures: la partie jusqu'au dernier / (qui est le répertoire du fichier), et le nom du fichier lui-même. Le répertoire est laissé intact, mais le nom de fichier est transformé en minuscules. Donc, si les
find
sorties./FOO/BAR
, il deviendramv -n -v -T ./FOO/BAR ./FOO/bar
. L'-n
option demv
garantit que les fichiers minuscules existants ne sont pas écrasés. L'-v
option rendmv
sortie chaque changement qu'elle fait (ou ne fait pas - si elle./FOO/bar
existe déjà, elle produit quelque chose comme./FOO/BAR -> ./FOO/BAR
, en notant qu'aucun changement n'a été effectué). Le-T
est très important ici - il traite le fichier cible comme un répertoire. Cela garantira que ce répertoire./FOO/BAR
n'est pas déplacé./FOO/bar
si ce répertoire existe.Utilisez-le avec
find
pour générer une liste de commandes qui seront exécutées (pratique pour vérifier ce qui sera fait sans le faire réellement)C'est assez explicite. Il achemine toutes les
mv
commandes générées vers l'interpréteur shell. Vous pouvez le remplacer parbash
ou n'importe quelle coque de votre choix.la source
Renommer Slugify (regex)
Ce n'est pas exactement ce que l'OP a demandé, mais ce que j'espérais trouver sur cette page:
Une version "slugify" pour renommer les fichiers afin qu'ils soient similaires aux URL (c'est-à-dire n'incluent que des caractères alphanumériques, des points et des tirets):
la source