Comment renommer tous les dossiers et fichiers en minuscules sous Linux?

179

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.

  1. 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.

  2. 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).

  3. 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.

vividos
la source
Le posté précédemment fonctionnera parfaitement hors de la boîte ou avec quelques ajustements pour les cas simples, mais il y a certaines situations que vous voudrez peut-être prendre en compte avant d'exécuter le changement de nom par lots: 1. Que devrait-il se passer si vous avez deux noms ou plus à le même niveau dans la hiérarchie des chemins qui ne diffèrent que par cas, comme ABCdef, abcDEFet aBcDeF? 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 nom
Mihai Limbășan

Réponses:

179

Une version concise utilisant la "rename"commande:

find my_root_dir -depth -exec rename 's/(.*)\/([^\/]*)/$1\/\L$2/' {} \;

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".

for SRC in `find my_root_dir -depth`
do
    DST=`dirname "${SRC}"`/`basename "${SRC}" | tr '[A-Z]' '[a-z]'`
    if [ "${SRC}" != "${DST}" ]
    then
        [ ! -e "${DST}" ] && mv -T "${SRC}" "${DST}" || echo "${SRC} was not renamed"
    fi
done

PS

Ce dernier permet plus de flexibilité avec la commande de déplacement (par exemple, "svn mv").

Alex B
la source
36
en utilisant renommer peut être fait de cette façon aussi renommer 'y / AZ / az /' *
Tzury Bar Yochay
3
Attention, les deux versions ne fonctionneront pas sur un système de fichiers insensible à la casse. Dans mon cas, j'ai remplacé la thenligne -enclosed par (mv "${SRC}" "${DST}.renametmp" && mv "${DST}.renametmp" "${DST}") || echo "${SRC} was not renamed".
Lloeki
6
La deuxième approche ne fonctionnait pas correctement pour moi avec des fichiers contenant des espaces vides (contexte: linux, bash).
dim
4
En utilisant la dernière version de renommer, aucune regex n'est nécessaire. La commande complète devient 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)
Javache
Le second a fonctionné pour moi sur Solaris en supprimant le -Tde la mvcommande.
Ham
261

Plus petit encore j'aime bien:

rename 'y/A-Z/a-z/' *

Sur les systèmes de fichiers insensibles à la casse tels que HFS + d' OS X , vous voudrez ajouter l' -findicateur:

rename -f 'y/A-Z/a-z/' *
tristanbailey
la source
3
linux.icydog.net/rename.php :The renaming utility that comes by default with Ubuntu is a Perl program sometimes called prename
sleepsort
1
Merci, je l'ai utilisé de cette manière $ find | xargs renommer 'y / AZ / az /' *
Rashi
5
Cela suppose que vous ayez renommé Perls, ce qui n'est pas toujours le cas. par exemple sur mon changement de nom debian est complètement différent
Krzysztof Krasoń
10
Sur Arch, le programme est appelé perl-rename(et est fourni par un package du même nom)
jaymmer - Rétablir Monica
3
Cela ne répond pas au problème donné car "renommer" n'est pas récursif.
Cybolic
89
for f in `find`; do mv -v "$f" "`echo $f | tr '[A-Z]' '[a-z]'`"; done
Swaroop CH
la source
Veuillez faire un "mkdir -p A / B / C" avant d'exécuter votre script.
tzot le
2
"find" doit être remplacé par la commande que vous utilisez pour obtenir une liste des fichiers que vous souhaitez renommer; par exemple, "ls *. {C, CPP, H}".
JPaget
2
Ne fonctionne pas sous OS X, imprime simplement les informations d'utilisation pour find. find .semble résoudre ce problème.
emlai
3
La version "consolidée", de tous les commentaires (la réponse ne peut plus être modifiée):for f in `find .`; do mv -v "$f" "`echo $f | tr '[A-Z]' '[a-z]'`"; done
romaricdrigon
1
Quelqu'un peut-il expliquer à mon pourquoi cela devrait fonctionner en premier lieu? S'il trouve ./FOO et ./FOO/BAR, il renomme d'abord ./FOO en ./foo, après quoi il ne peut plus trouver ./FOO/BAR. En entrant ma propre réponse ci-dessous, cela devrait résoudre ce problème.
oisyn le
80

Essayez simplement ce qui suit si vous n'avez pas besoin de vous soucier de l'efficacité.

zip -r foo.zip foo/*
unzip -LL foo.zip
Ginhing
la source
13
Wow, c'est une manière assez inefficace.
Artjom B.
28
En supposant que l'efficacité de calcul n'est généralement PAS un problème lorsque vous avez besoin de renommer des fichiers dans un répertoire ... Je pense que c'est probablement la solution la plus créative sur ce fil. Vraiment quelque chose d'aussi trivial ne devrait pas être aussi compliqué que le démontrent les réponses acceptées et cette solution de contournement est beaucoup plus proportionnée à la quantité de réflexion que je souhaite investir dans une opération comme celle-ci. +1000
Peter M. Elias
27
Vous pouvez accélérer avec -0(que de la zéro 'de, pas de compression) commutateur zip -0 -r foo.zip foo/.
Johnny Baloney
3
J'ai dû changer plus de 50'000 noms de fichiers dans différentes structures de répertoires. La réponse originale acceptée a fait à peine 10% du travail en 2 minutes alors que cela, avec la -0compression, était presque instantané!
Peon
2
Ce n'est pas simplement inefficace. Celui-ci est tout simplement impossible s'il n'y a pas assez d'espace libre pour une archive temporaire.
Victor Yarema
19

Mec, vous aimez trop compliquer les choses ... Utilisez:

rename 'y/A-Z/a-z/' *
Stephen
la source
2
Cela ne fonctionne pas, cela dit que le fichier avec le nom en minuscule existe déjà.
kirhgoff
@kirhgoff J'ai vu cela se produire avec les montages NFS - suivez les instructions ici .
joebeeson
Comment renommer sur un système de fichiers sensible à la casse? 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.
Pablo A
14

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 findl' -print0option 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:

find .  -type f -print0 | xargs -0n 1 bash -c \
's=$(dirname "$0")/$(basename "$0");
d=$(dirname "$0")/$(basename "$0"|tr "[A-Z]" "[a-z]"); mv -f "$s" "$d"'

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

touch \;\ echo\ hacker::0:0:hacker:\$\'\057\'root:\$\'\057\'bin\$\'\057\'bash

... bien devinez quoi ...

niXar
la source
Ce serait plus simple à utiliser renameau lieu de mv.
Victor Yarema
14

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):

rename --lower-case --force somedir/*
alémol
la source
9
... si vous configurez d'abord le changement de nom, par exemple viabrew install rename
pduersteler
3
renommer 'y / AZ / az /' *
Stephen
4
--lower-case? Ce n'est malheureusement pas le cas dans Arch Linux du moins.
3
renamen'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.
Corey Goldberg
2
A peine cochée, la renamecommande incluse dans le dernier Fedora (28), via util-linux-2.31package, n'a pas l' --lower-caseoption.
niXar
11

Cela fonctionne sur CentOS / Red Hat Linux ou d'autres distributions sans le renamescript Perl:

for i in $( ls | grep [A-Z] ); do mv -i "$i" "`echo $i | tr 'A-Z' 'a-z'`"; done

Source: Renommez tous les noms de fichiers de majuscules à minuscules

(Dans certaines distributions, la renamecommande par défaut provient de util-linux, et c'est un outil différent et incompatible.)

Père
la source
Cela ne fonctionne que sur un seul répertoire, pas de manière récursive
Bram
Coool .. Fonctionne bien
Manikandan Ram
6

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/ :

brew install rename
rename --force --lower-case --nows *

--force Rename même lorsqu'un fichier avec le nom de destination existe déjà.

--lower-case Convertit les noms de fichiers en minuscules.

--nows Remplace toutes les séquences d'espaces dans le nom de fichier par des caractères de soulignement uniques.

Kim T
la source
5

Voici ma solution sous-optimale, en utilisant un script shell Bash:

#!/bin/bash
# First, rename all folders
for f in `find . -depth ! -name CVS -type d`; do
   g=`dirname "$f"`/`basename "$f" | tr '[A-Z]' '[a-z]'`
   if [ "xxx$f" != "xxx$g" ]; then
      echo "Renaming folder $f"
      mv -f "$f" "$g"
   fi
done

# Now, rename all files
for f in `find . ! -type d`; do
   g=`dirname "$f"`/`basename "$f" | tr '[A-Z]' '[a-z]'`
   if [ "xxx$f" != "xxx$g" ]; then
      echo "Renaming file $f"
      mv -f "$f" "$g"
   fi
done

Les dossiers sont tous renommés correctement et mvne 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.

vividos
la source
Votre première découverte ne fonctionne pas. Essayez "mkdir -p A / B / C" puis exécutez votre script.
tzot le
4

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:

find . -name CVS -prune -o -exec mv '{}' `echo {} | tr '[A-Z]' '[a-z]'` \; -print

[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:

$> cat > tolower
#!/bin/bash
mv $1 `echo $1 | tr '[:upper:]' '[:lower:]'`
^D
$> chmod u+x tolower 
$> find . -name CVS -prune -o -exec tolower '{}'  \;

Ian

Ian Dickinson
la source
4

Utilisation du fixateur de nom de fichier de Larry Wall:

$op = shift or die $help;
chomp(@ARGV = <STDIN>) unless @ARGV;
for (@ARGV) {
    $was = $_;
    eval $op;
    die $@ if $@;
    rename($was,$_) unless $was eq $_;
}

C'est aussi simple que

find | fix 'tr/A-Z/a-z/'

(où fixest bien sûr le script ci-dessus)

agnul
la source
3

Ceci est un petit script shell qui fait ce que vous avez demandé:

root_directory="${1?-please specify parent directory}"
do_it () {
    awk '{ lc= tolower($0); if (lc != $0) print "mv \""  $0 "\" \"" lc "\"" }' | sh
}
# first the folders
find "$root_directory" -depth -type d | do_it
find "$root_directory" ! -type d | do_it

Notez l'action -depth dans la première recherche.

tzot
la source
1
La seule chose qui a fonctionné sur un Mac à partir de l'ensemble du fil. Merci des tas!
YemSalat
2

Pas portable, Zsh seulement, mais assez concis.

Tout d'abord, assurez-vous qu'il zmvest chargé.

autoload -U zmv

Assurez extendedglob- vous également qu'il est activé:

setopt extendedglob

Puis utilisez:

zmv '(**/)(*)~CVS~**/CVS' '${1}${(L)2}'

Pour récursivement des fichiers et des répertoires en minuscules dont le nom n'est pas CVS .

benjwadams
la source
2
for f in `find -depth`; do mv ${f} ${f,,} ; done

find -depthimprime 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.

Chris Schierkolk
la source
Cela ne fonctionne pas: il renomme un répertoire avant d'agir sur le contenu, de sorte que la tentative ultérieure sur le contenu échoue.
Prune le
L'ajout -depthcorrige ça! C'est une solution vraiment rapide, mais bien sûr, sans utiliser l' -print0option de recherche, ce n'est pas la plus fiable
jpaugh
@jpaugh Non, ce n'est pas le cas. Il essaiera de renommer ./FOO/BAR en ./foo/bar, mais ./foo n'existe pas encore à ce moment-là.
oisyn le
2

Avec MacOS,

Installez le renamepackage,

brew install rename

Utilisation,

find . -iname "*.py" -type f | xargs -I% rename -c -f  "%"                       

Cette commande trouve tous les fichiers avec une *.pyextension et convertit les noms de fichiers en minuscules.

`f` - forces a rename

Par exemple,

$ find . -iname "*.py" -type f
./sample/Sample_File.py
./sample_file.py
$ find . -iname "*.py" -type f | xargs -I% rename -c -f  "%"
$ find . -iname "*.py" -type f
./sample/sample_file.py
./sample_file.py
akilesh raj
la source
Pourquoi avez-vous utilisé l' -Ioption xargsici?
Victor Yarema
Le - Idrapeau n'est pas obligatoire. Il est utilisé lorsque nous exécutons plusieurs commandes avec xargs. Voici un exemple d'utilisation de plusieurs commandes avec xargs cat foo.txt | xargs -I % sh -c 'echo %; mkdir %' You can run without -Ilikefind . -iname "*.py" -type f | xargs -I% rename -c -f "%"
akilesh raj
2

Utilisez le type :

typeset -l new        # Always lowercase
find $topPoint |      # Not using xargs to make this more readable
  while read old
  do new="$old"       # $new is a lowercase version of $old
     mv "$old" "$new" # Quotes for those annoying embedded spaces
  done

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 mvest le fichier à un autre nom, comme "$ old.tmp", puis à $new.

Paul Hodges
la source
1

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).

# adapt the following command _IF_ you want to deal with specific files/dirs
find . -depth -mindepth 1 -exec bash -c '
  for file do
    # adapt the awk command if you wish to rename to something other than lowercase
    newname=$(dirname "$file")/$(basename "$file" | awk "{print tolower(\$0)}")
    if [ "$file" != "$newname" ] ; then
        # the extra step with the temp filename is for case-insensitive filesystems
        if [ ! -e "$newname" ] && [ ! -e "$newname.lcrnm.tmp" ] ; then
           mv -T "$file" "$newname.lcrnm.tmp" && mv -T "$newname.lcrnm.tmp" "$newname" 
        else
           echo "ERROR: Name already exists: $newname"
        fi
    fi    
  done
' sh {} +

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?

ndemou
la source
1

Cela fonctionne aussi bien sur macOS:

ruby -e "Dir['*'].each { |p| File.rename(p, p.downcase) }"
Chris
la source
C'est particulièrement agréable puisque Ruby est livré avec macOS.
jxmorris12
1

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 :-)

ls | while read upName; do loName=`echo "${upName}" | tr '[:upper:]' '[:lower:]'`; mv "$upName" "$loName"; done

(NB: j'avais précédemment remplacé les espaces par des traits de soulignement en utilisant:

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

)

Jacanterbury
la source
1

Sous OS X, mv -faffiche l'erreur «même fichier», donc je renomme deux fois:

for i in `find . -name "*" -type f |grep -e "[A-Z]"`; do j=`echo $i | tr '[A-Z]' '[a-z]' | sed s/\-1$//`; mv $i $i-1; mv $i-1 $j; done
Parc Jonghee
la source
1

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 python2tendance à être installé dans plus d'endroits que rename.

#!/usr/bin/env python2
import sys, os

def rename_dir(directory):
  print('DEBUG: rename('+directory+')')

  # Rename current directory if needed
  os.rename(directory, directory.lower())
  directory = directory.lower()

  # Rename children
  for fn in os.listdir(directory):
    path = os.path.join(directory, fn)
    os.rename(path, path.lower())
    path = path.lower()

    # Rename children within, if this child is a directory
    if os.path.isdir(path):
        rename_dir(path)

# Run program, using the first argument passed to this Python script as the name of the folder
rename_dir(sys.argv[1])
John Foley
la source
Parlez de rendre les choses compliquées ... faites simplement ... renommer 'y / AZ / az /' *
Stephen
1
@Stephen, cela suppose que vous avez un accès administrateur pour installer renommer. J'ai souvent besoin de trouver des données sur des systèmes sur lesquels je n'ai pas la possibilité d'installer d'autres logiciels. Dans Ubuntus récent, cela n'est installé que si perl est présent.
John Foley
1

Si vous utilisez Arch Linux , vous pouvez installer rename) package à partir de AURqui fournit la renamexmcommande en tant /usr/bin/renamexmqu'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

rename -l Developers.mp3 # or --lowcase

Convertir en cas supérieur

rename -u developers.mp3 # or --upcase, long option

Autres options

-R --recursive # directory and its children

-t --test # Dry run, output but don't rename

-o --owner # Change file owner as well to user specified

-v --verbose # Output what file is renamed and its new name

-s/str/str2 # Substitute string on pattern

--yes # Confirm all actions

Vous pouvez récupérer l'exemple de fichier Developers.mp3 à partir d' ici , si nécessaire;)

Peter Mortensen
la source
1
renommer à partir brewde macOS est -llié à la création d'un lien symbolique et -cà la conversion en minuscules, alors faites attention.
rien333
0
( find YOURDIR -type d | sort -r;
  find yourdir -type f ) |
grep -v /CVS | grep -v /SVN |
while read f; do mv -v $f `echo $f | tr '[A-Z]' '[a-z]'`; done

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ù ...

pklausner
la source
Premièrement: find YOURDIR -type d | sort -rc'est trop de problèmes. Tu veux find YOURDIR -depth -type d. Deuxièmement, le find -type fDOIT s'exécuter après que les répertoires ont été renommés.
tzot le
0
find . -depth -name '*[A-Z]*'|sed -n 's/\(.*\/\)\(.*\)/mv -n -v -T \1\2 \1\L\2/p'|sh

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. renamen'est pas disponible, et de nombreuses variantes findéchouent car il semble s'en tenir à l'ancien nom du chemin déjà renommé (par exemple, s'il trouve ./FOOsuivi de ./FOO/BAR, renommer ./FOOen ./foocontinuera à être répertorié ./FOO/BARmê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:


find . -depth -name '*[A-Z]*'

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/baravant ./foo), mais seulement pour les fichiers qui contiennent un caractère majuscule. Le -namefiltre s'applique uniquement au nom du fichier de base, pas au chemin complet. Donc, cela listera ./FOO/BARmais 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 -depthest 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.


sed -n 's/\(.*\/\)\(.*\)/mv -n -v -T \1\2 \1\L\2/p'

Cette partie lit les fichiers produits par findet les formate dans une mvcommande à l'aide d'une expression régulière. L' -noption arrête sedd'imprimer l'entrée et la pcommande 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 findsorties ./FOO/BAR, il deviendra mv -n -v -T ./FOO/BAR ./FOO/bar. L' -noption de mvgarantit que les fichiers minuscules existants ne sont pas écrasés. L' -voption rend mvsortie chaque changement qu'elle fait (ou ne fait pas - si elle ./FOO/barexiste déjà, elle produit quelque chose comme ./FOO/BAR -> ./FOO/BAR, en notant qu'aucun changement n'a été effectué). Le -Test très important ici - il traite le fichier cible comme un répertoire. Cela garantira que ce répertoire ./FOO/BARn'est pas déplacé ./FOO/barsi ce répertoire existe.

Utilisez-le avec findpour 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)


sh

C'est assez explicite. Il achemine toutes les mvcommandes générées vers l'interpréteur shell. Vous pouvez le remplacer par bashou n'importe quelle coque de votre choix.

oisyn
la source
0

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):

rename "s/[^a-zA-Z0-9\.]+/-/g" filename
cwd
la source
2
"pas exactement"? ce n'est pas du tout ce que l'OP a demandé
Corey Goldberg