Je cherche un moyen (de préférence terminal) d'organiser plus de 1000 polices par leur première lettre.
Fondamentalement, créez des répertoires, A-Z, #
puis déplacez les fichiers de police vers ces répertoires en fonction du premier caractère de leur nom de fichier. Polices commençant par des chiffres [0-9] ou d'autres caractères spéciaux à déplacer vers le #
répertoire.
command-line
files
Parto
la source
la source
Réponses:
Une option de python tardif:
Comment utiliser
move_files.py
Exécutez-le avec le répertoire comme argument:
Le script ne crée le (sous) répertoire (-ies) (majuscule) que s'il est réellement nécessaire
Explication
Le script:
liste les fichiers, obtient le premier caractère (définit le chemin source):
vérifie si l'élément est un fichier:
définit le dossier cible pour si le premier caractère est alpha ou non:
vérifie si le dossier existe déjà ou non, le crée sinon:
déplace l'élément dans son dossier correspondant:
la source
Joué au code mais lisible avec seulement deux commandes et deux expressions régulières:
Si vous avez une énorme quantité de fichiers à déplacer, trop nombreux pour tenir dans la liste des arguments du processus (oui, il y a une limite et cela peut être seulement quelques kilo-octets), vous pouvez générer la liste des fichiers avec une commande et un canal différents pour
prename
, par exemple:Cela a l'avantage supplémentaire de ne pas essayer de déplacer le nom de fichier littéral
[[:alnum:]]?*
si aucun fichier ne correspond au modèle global.find
permet également beaucoup plus de critères de correspondance que la globalisation du shell. Une alternative consiste à définir l'nullglob
option shell et à fermer le flux d'entrée standard deprename
. 1Dans les deux cas, supprimez le
-n
commutateur pour déplacer réellement les fichiers et pas seulement montrer comment ils seraient déplacés.Addendum: vous pouvez à nouveau supprimer les répertoires vides avec:
1
shopt -s nullglob; prename ... <&-
la source
Si cela ne vous dérange pas zsh, une fonction et quelques
zmv
commandes:La
mmv
fonction crée le répertoire et déplace le fichier.zmv
fournit ensuite le filtrage et la substitution de motifs. Tout d'abord, déplacer les noms de fichiers commençant par un alphabet, puis tout le reste:Exécutez à nouveau sans
echo
dansmmv
la définition de » pour réaliser effectivement le mouvement.la source
Je n'ai pas trouvé une bonne façon de mettre les noms de répertoires en majuscules (ou de déplacer les fichiers avec des lettres majuscules), bien que vous puissiez le faire ensuite avec
rename
...ou plus lisible:
Supprimer
echo
après les tests pour déplacer réellement les fichiersPuis
supprimer
-n
si cela semble bon après le test et réexécuter.la source
if [[ -d "${i^}" ]]
pour faire lei
capital variable , etmkdir {A..Z}
au début.Les commandes suivantes dans le répertoire contenant les polices devraient fonctionner, si vous souhaitez utiliser à l'extérieur du répertoire de stockage des polices, passez
for f in ./*
àfor f in /directory/containing/fonts/*
. Il s'agit d'une méthode très basée sur le shell, donc assez lente et non récurrente. Cela ne créera des répertoires que s'il existe des fichiers commençant par le caractère correspondant.Comme une ligne, à nouveau à partir du répertoire de stockage des polices:
Une méthode utilisant find, avec une manipulation de chaîne similaire, utilisant l'expansion des paramètres bash, qui sera récursive, et devrait être un peu plus rapide que la version pure shell:
Ou plus lisible:
la source
Mappez chaque nom de fichier à un nom de répertoire en utilisant
tr
, puismkdir
etmv
:la source
tr
pour convertir en majuscules.xargs
juste pour rappelerbash
? Ne serait-il pas plus simple et beaucoup plus lisible de diriger la sortie defind
dans une boucle while et d'read
y enregistrer enregistrement par enregistrement?while
version en boucle ( bit.ly/2j2mhyb ) est peut-être meilleure.{}
substitution si vous laissezxargs
append l'argument puis reportez - vous à l'$1
intérieur du script shell, par exemple:xargs -0 -n1 -- bash -c 'dir=/dest/$(basename "$1" | ...); ...; mv "$1" "$dir"' _
. (Attention à la finale_
!)